左右之间的区别

时间:2015-03-01 23:49:34

标签: haskell

我目前正在阅读优秀的"了解大家好的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"]

1 个答案:

答案 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]