在我的空闲时间我正在学习Haskell,所以这是一个初学者的问题。了解如何是Functor的一个实例
在我的阅读我跨越说明如何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
如果我们替代
f
与Either a
我们得到fmap :: (c -> d) -> Either a c -> Either a d
的
Right (g x)
类型为Either a (g x)
,并且g x
类型为d
,所以我们有一个的Right (g x)
类型是Either a d
,这是我们从fmap
预期(见上文2)现在,如果我们看一下
Left (g x)
我们可以用同样的理由说,它的类型是Either (g x) b
,即Either d b
,这不是我们从fmap
预期(见2以上):在d
应该是第二个参数,不是第一!所以我们不能通过Left
来映射。
我的推理是否正确?
要么是可能更明显比算符一个Bifunctor - 一个Bifunctor具有操作的bimap - bimap的::(一 - >米) - >( b→n)→fab→fm n。这使您可以在左右两种情况下进行映射。 Haskell的标准库没有Bifunctor类,这是因为虽然它适用于Either和pair(a,b),但它比“疯子”中的Functors少得多。 – 2011-03-04 16:12:33
3,你使用(g x)作为类型的一部分,但它是一个值。看来你打算在那里写'typeof(g x)',而不是'(g x)'本身。 – Peaker 2011-03-05 23:20:20
@stephen tetley:这很有趣!谢谢 – MarcoS 2011-03-07 08:41:33