我目前正在阅读优秀的"了解大家好的Haskell"以及section about functors中有一个涉及Either
的例子我不明白:
ghci> fmap (replicate 3) (Right "blah")
Right ["blah","blah","blah"]
ghci> fmap (replicate 3) (Left "foo")
Left "foo"
为什么后者不是Left ["foo", "foo", "foo"]
?
答案 0 :(得分:13)
Left
上的Either
构造函数被实现为"失败案例"。像其他仿函数一样,一旦这个失败值进入等式,它就会阻止任何真实的计算发生。因此,当您将fmap
应用于Left "foo"
时,它会立即返回相同的"失败"值。
您可以通过查看Either
如何实现fmap
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
这里的想法是Left "foo"
实际上会更具描述性,例如Left "Value could not be computed"
。如果您尝试将其他函数应用于该值,则只需要"错误"完整传递。
如果它有帮助,试想一下fmap
如何在失败案例更明显的其他类型上起作用,例如:
-- Maybe: failure value is `Nothing`
fmap (replicate 3) (Nothing)
这会产生Nothing
,而非[Nothing, Nothing, Nothing]