Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 左右之差_Haskell - Fatal编程技术网

Haskell 左右之差

Haskell 左右之差,haskell,Haskell,我目前正在读一本优秀的《为伟大的事业向你学习哈斯克尔》(Learning You a Haskell for Great Good),其中有一个例子涉及或,我不明白: ghci>fmap(复制3)(右“blah”) 右[“诸如此类”、“诸如此类”、“诸如此类”] ghci>fmap(复制3)(左“foo”) 左“foo” 为什么后者不是左[“foo”,“foo”,“foo”]?在上的左构造函数被实现为“失败案例”。与其他函子一样,一旦该失效值进入方程,它将阻止任何实际计算的发生。因此,当您将

我目前正在读一本优秀的《为伟大的事业向你学习哈斯克尔》(Learning You a Haskell for Great Good),其中有一个例子涉及
,我不明白:

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”,因此是错误/不正确/失败的。