【发布时间】:2016-07-10 11:44:01
【问题描述】:
Prelude> :t (+2) <$> Just 2
(+2) <$> Just 2 :: Num b => Maybe b
Prelude> :t fmap (+2) Just 2
fmap (+2) Just 2 :: (Num (Maybe t), Num t) => Maybe t
但是,如果我在 Maybe 类型周围添加括号,我会得到预期的相同结果:
Prelude> :t fmap (+2) (Just 2)
fmap (+2) (Just 2) :: Num b => Maybe b
所以我的问题是为什么 - 它是 Maybe 数据构造函数的意义还是其他什么?
【问题讨论】:
-
您在第二个示例中缺少括号。试试
:t fmap (+2) (Just 2) -
括号是必需的,因为这就是解析haskell的方式。它与 Maybe 类型无关。
-
请注意,正在发生的事情是
(+2)和Just是类型为Num a => a -> a和b -> Maybe b的函数,fmap正在使用Functorinstance of->,现在由仿函数实例我们有fmap f g = \y -> f (g y)在我们的例子中f = (+2)和g = Just,所以fmap (+2) Just = \y -> (+2) (Just y)现在你将它应用到2并且你得到(+2) (Just 2)。这解释了Num (Maybe t)约束。
标签: haskell