功能应用:为什么在这里使用$?

J C*_*per 8 haskell function operators pointfree

不久前,我问了一个关于$问题,并得到了有用的答案 - 事实上,我以为我明白了如何使用它.

看来我错了:(

此示例显示在教程中:

instance Monad [] where
   xs >>= f = concat . map f $ xs
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活看到为什么在那里使用$; ghci也没有帮助我,因为我在那里进行的测试似乎表明与简单省略$的版本等效.有人可以为我澄清一下吗?

Tom*_*rst 11

$这里使用的是因为它的优先级低于普通函数应用程序.编写此代码的另一种方法是这样的:

instance Monad [] where
   xs >>= f = (concat . map f) xs
Run Code Online (Sandbox Code Playgroud)

这里的想法是首先构造一个函数(concat . map f),然后将它应用于它的参数(xs).如图所示,这也可以通过简单地在第一部分周围加括号来完成.

请注意,$无法省略原始定义中的内容,将导致类型错误.这是因为函数组合运算符(the .)的优先级低于普通函数应用程序,有效地将表达式转换为:

instance Monad [] where
  xs >>= f = concat . (map f xs)
Run Code Online (Sandbox Code Playgroud)

这没有意义,因为函数组合运算符的第二个参数根本不是函数.虽然以下定义确实有意义:

instance Monad [] where
  xs >>= f = concat (map f xs)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这也是我更喜欢的定义,因为在我看来它更清晰.

  • 要添加噪音:(>> =)= flip concatMap - =) (2认同)