【问题标题】:Why does using fmap's infix synonym <$> return a different type for this expression?为什么使用 fmap 的中缀同义词 <$> 会为这个表达式返回不同的类型?
【发布时间】: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 =&gt; a -&gt; ab -&gt; Maybe b 的函数,fmap 正在使用 Functor instance of -&gt;,现在由仿函数实例我们有fmap f g = \y -&gt; f (g y) 在我们的例子中f = (+2)g = Just,所以fmap (+2) Just = \y -&gt; (+2) (Just y) 现在你将它应用到2 并且你得到(+2) (Just 2)。这解释了Num (Maybe t) 约束。

标签: haskell


【解决方案1】:

中缀运算符的优先级总是低于函数应用程序,因此(+2) &lt;$&gt; Just 2(+2) &lt;$&gt; (Just 2) 相同,因此(&lt;$&gt;) (+2) (Just 2) 相同。如果您使用fmap 作为中缀运算符:

(+2) `fmap` Just 2

你会得到同样的结果。

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多