我目前正在阅读优秀的"了解你是一个很好的Haskell",在关于仿函数的部分中有一个Either我不明白的例子:
ghci> fmap (replicate 3) (Right "blah")
Right ["blah","blah","blah"]
Run Code Online (Sandbox Code Playgroud)
ghci> fmap (replicate 3) (Left "foo")
Left "foo"
Run Code Online (Sandbox Code Playgroud)
后者为什么不Left ["foo", "foo", "foo"]呢?
Mic*_*eld 14
在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
Run Code Online (Sandbox Code Playgroud)
这里的想法Left "foo"实际上是更具描述性的东西,比如Left "Value could not be computed".如果您尝试将其他函数应用于该值,则只需要将"错误"完整传递.
如果它fmap有所帮助,想象一下如何在故障情况更明显的其他类型上工作,例如:
-- Maybe: failure value is `Nothing`
fmap (replicate 3) (Nothing)
Run Code Online (Sandbox Code Playgroud)
这Nothing不会产生[Nothing, Nothing, Nothing]