【发布时间】:2011-07-08 21:23:23
【问题描述】:
在空闲时间我正在学习 Haskell,所以这是一个初学者问题。
在我的阅读中,我遇到了一个示例,说明Either a 如何成为Functor 的实例:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
现在,我试图理解为什么在 Right 值构造函数的情况下实现映射,但在 Left 的情况下却没有?
这是我的理解:
首先让我将上面的实例重写为
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
现在:
我知道
fmap :: (c -> d) -> f c -> f d如果我们用
Either a替换f,我们得到fmap :: (c -> d) -> Either a c -> Either a dRight (g x)的类型是Either a (g x),g x的类型是d,所以我们得到Right (g x)的类型是Either a d,这就是我们所期望的fmap(见上文 2.)
1234563 . 以上):
d 应该是第二个参数,而不是第一个!所以我们不能映射到Left。
我的推理正确吗?
【问题讨论】:
-
这两个可能比 Functor 更明显是 Bifunctor - Bifunctor 有一个操作 bimap - bimap :: (a -> m) -> (b -> n) -> fab -> fm n .这为您提供了左右两种情况的映射。 Haskell 的标准库没有 Bifunctor 类,这是因为 Bifunctor 比“野外”的 Functor 少得多,尽管它对 Either 和 pair (a,b) 很方便。
-
在 3 中,您使用 (g x) 作为类型的一部分,但它是一个值。看来您打算在那里写
typeof (g x),而不是(g x)本身。 -
@stephen tetley:这很有趣!谢谢
-
@stephentetley 我知道你之前写过这个,但现在 Bifunctor 从 base-4.8.0.0 开始就在标准库中:hackage.haskell.org/package/base-4.8.0.0/docs/…
标签: haskell typeclass functor either