在我的空闲时间我正在学习 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
如果我们
f
用Either a
我们代替fmap :: (c -> d) -> Either a c -> Either a d
is 的类型和
Right (g x)
isEither a (g x)
的类型,所以我们有 is 的类型g x
,这是我们所期望的(参见上面的 2.)d
Right (g x)
Either a d
fmap
现在,如果我们看一下,
Left (g x)
我们可以使用相同的推理来说它的类型是Either (g x) b
,即Either d b
,这不是我们所期望的fmap
(参见上面的 2.):d
应该是第二个参数,而不是第一个!所以我们不能映射过去Left
。
我的推理正确吗?