我有一行代码:
(++) <$> Just "Hallo" <*> Just "Du"
输出Just "HalloDu"
在&#34;了解你的好事Haskell&#34;我了解到<$>
和fmap
是相同的,我确实向我输出了相同类型的签名。不过,当我写道:
fmap (++) Just "Hallo" <*> Just "Du"
区别在哪里?
答案 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"
。