Konstruktor Left
na Either
jest zaimplementowany jako "przypadek awarii". Podobnie jak inne funktory, gdy wartość tego błędu przejdzie do równania, uniemożliwia to jakiekolwiek rzeczywiste obliczenia. Tak więc, gdy zastosujesz fmap
do Left "foo"
, natychmiast zwróci tę samą wartość "niepowodzenia".
Można to zobaczyć patrząc jak Either
realizuje fmap
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Chodzi o to, że Left "foo"
byłby rzeczywiście coś bardziej opisowy, jak Left "Value could not be computed"
. Jeśli spróbujesz zastosować dodatkowe funkcje do tej wartości, po prostu chcesz, aby "błąd" został poprawnie przekazany.
Jeśli to nie pomaga, tylko sobie wyobrazić, jak fmap
będzie działać na innym rodzaju, gdzie w przypadku awarii jest bardziej oczywista, np
-- Maybe: failure value is `Nothing`
fmap (replicate 3) (Nothing)
To daje Nothing
nie [Nothing, Nothing, Nothing]
Jeśli chcesz tego ostatniego zachowania , [Albo jest bifunctor] (https://hackage.haskell.org/package/bifunctors-4.2/docs/Data-Bifunctor.html). – kqr