Tôi nghĩ nó chỉ rơi xuống Principle of Least Astonishment. Sử dụng Either
để mã hóa thành công hay thất bại rõ ràng là một cái gì đó mọi người làm, nhưng nó không phải là việc sử dụng duy nhất của Either
. Trong thực tế, không có nhiều lý do để có Right
là thành công và Left
là thất bại khác với truyền thống. Như bình luận của adelbertc ở trên đề cập, scalaz có Validation
mã hóa cụ thể điều này.
Để biện minh tiếp tục khẳng định POLA trên, lấy mã này:
def foo(): Either[Int, Int] = Right(1)
def bar(j: Int): Either[Int, Int] = Left(1)
def baz(z: Int): Either[Int, Int] = Right(3)
// Result is Left(1)
for (a <- foo().right; b <- bar(a).right; c <- baz(b).right) yield c
này biên dịch bởi vì tôi đang sử dụng chiếu .right
trong biểu thức for
. Điều này có ý nghĩa ở đây là Left(1)
trong bar
là trường hợp lỗi và do đó, đó là kết quả, nhưng hãy tưởng tượng nếu Either
là Right
. Đoạn mã trên sẽ biên dịch mà không có sự .right
dự báo trong biểu thức như:
for (a <- foo(); b <- bar(a); c <- baz(b)) yield c
Nếu bạn sử dụng Either
trong mã của bạn chỉ là một "một hoặc-the-khác" loại, bạn sẽ ngạc nhiên bởi (1) thực tế là điều này sẽ biên dịch và (2) nó trả về Left(1)
và dường như không bao giờ thực hiện baz
.
Tóm lại, sử dụng Validation
nếu bạn muốn sử dụng Either
để mã hóa thành công hay thất bại.
Không thực sự trả lời câu hỏi, nhưng nếu bạn kiểm tra "Xác thực" của Scalaz có vẻ là thứ bạn đang tìm kiếm, nhiều hơn hoặc ít hơn. – adelbertc