Nhà xây dựng Left
trên Either
được triển khai là "trường hợp lỗi". Giống như các functors khác, một khi giá trị thất bại này đi vào phương trình, nó ngăn cản bất kỳ tính toán thực sự nào xảy ra. Do đó, khi bạn áp dụng fmap
cho Left "foo"
, ngay lập tức trả về cùng một giá trị "lỗi".
Bạn có thể thấy điều này bằng cách nhìn vào cách Either
thực hiện fmap
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Ý tưởng ở đây là Left "foo"
thực sự sẽ là một cái gì đó mô tả nhiều hơn, giống như Left "Value could not be computed"
. Nếu bạn cố gắng áp dụng các hàm khác cho giá trị đó, bạn chỉ muốn "lỗi" được truyền đi nguyên vẹn.
Nếu nó giúp, chỉ cần tưởng tượng như thế nào fmap
sẽ làm việc trên một số loại khác, nơi các trường hợp thất bại là rõ ràng hơn, ví dụ:
-- Maybe: failure value is `Nothing`
fmap (replicate 3) (Nothing)
này tạo Nothing
, không [Nothing, Nothing, Nothing]
Nguồn
2015-03-01 23:58:34
Nếu bạn muốn các hành vi sau , [Hoặc là một bifunctor] (https://hackage.haskell.org/package/bifunctors-4.2/docs/Data-Bifunctor.html). – kqr