Haskell 左右之差
我目前正在读一本优秀的《为伟大的事业向你学习哈斯克尔》(Learning You a Haskell for Great Good),其中有一个例子涉及Haskell 左右之差,haskell,Haskell,我目前正在读一本优秀的《为伟大的事业向你学习哈斯克尔》(Learning You a Haskell for Great Good),其中有一个例子涉及或,我不明白: ghci>fmap(复制3)(右“blah”) 右[“诸如此类”、“诸如此类”、“诸如此类”] ghci>fmap(复制3)(左“foo”) 左“foo” 为什么后者不是左[“foo”,“foo”,“foo”]?在上的左构造函数被实现为“失败案例”。与其他函子一样,一旦该失效值进入方程,它将阻止任何实际计算的发生。因此,当您将
或,我不明白:
ghci>fmap(复制3)(右“blah”)
右[“诸如此类”、“诸如此类”、“诸如此类”]
ghci>fmap(复制3)(左“foo”)
左“foo”
为什么后者不是左[“foo”,“foo”,“foo”]
?在上的左
构造函数被实现为“失败案例”。与其他函子一样,一旦该失效值进入方程,它将阻止任何实际计算的发生。因此,当您将fmap
应用于Left“foo”
时,它会立即返回相同的“failure”值
您可以通过查看或如何实现fmap
来了解这一点:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
这里的想法是Left“foo”
实际上是更具描述性的东西,比如Left”值无法计算“
。如果您试图对该值应用进一步的函数,您只希望“错误”能够完整地传递
如果有帮助,想象一下fmap
将如何在故障情况更明显的其他类型上工作,例如:
-- Maybe: failure value is `Nothing`
fmap (replicate 3) (Nothing)
这会产生无
,而不是[无,无,无]
谢谢您的快速回答!我已经理解了可能的行为。在或方面帮助我的是提醒自己,不是或是函子,而是或是函子@mkrieger1一个简单的记忆规则,用来记住哪个是哪个:Right
案例代表正确/成功/“Right”,而Left
案例代表“not Right”,因此是错误/不正确/失败的。