< $>的差异和fmap

时间:2015-10-27 18:07:19

标签: haskell

我有一行代码:

(++) <$> Just "Hallo" <*> Just "Du"

输出Just "HalloDu"

在&#34;了解你的好事Haskell&#34;我了解到<$>fmap是相同的,我确实向我输出了相同类型的签名。不过,当我写道:

fmap (++) Just "Hallo" <*> Just "Du"

区别在哪里?

1 个答案:

答案 0 :(得分:10)

<$>fmap是相同的,但您在不同的表达方式中使用它们。

(++) <$> Just "Hallo" <*> Just "Du"

相当于:

(++) `fmap` Just "Hallo" <*> Just "Du"

在中缀位置移动fmap

fmap (++) (Just "Hallo") <*> Just "Du"

这是由于运算符优先级以及为什么<$>在大多数情况下更具可读性。

请注意表达式:

fmap (++) Just "Hallo" <*> Just "Du"

您将3个参数传递给fmap(++)Just"Hallo"), 所以类型与<*>想要的不匹配。

您只想传递两个参数:(++)Just "Hallo"