不久前,我问了一个关于$的问题,并得到了有用的答案 - 事实上,我以为我明白了如何使用它.
看来我错了:(
此示例显示在教程中:
instance Monad [] where xs >>= f = concat . map f $ xs
我不能为我的生活看到为什么在那里使用$; ghci也没有帮助我,因为我在那里进行的测试似乎表明与简单省略$的版本等效.有人可以为我澄清一下吗?
$
这里使用的是因为它的优先级低于普通函数应用程序.编写此代码的另一种方法是这样的:
instance Monad [] where xs >>= f = (concat . map f) xs
这里的想法是首先构造一个函数(concat . map f
),然后将它应用于它的参数(xs
).如图所示,这也可以通过简单地在第一部分周围加括号来完成.
请注意,$
无法省略原始定义中的内容,将导致类型错误.这是因为函数组合运算符(the .
)的优先级低于普通函数应用程序,有效地将表达式转换为:
instance Monad [] where xs >>= f = concat . (map f xs)
这没有意义,因为函数组合运算符的第二个参数根本不是函数.虽然以下定义确实有意义:
instance Monad [] where xs >>= f = concat (map f xs)
顺便说一句,这也是我更喜欢的定义,因为在我看来它更清晰.