当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《功能应用:为什么在这里使用$?》经验,为你挑选了1个好方法。

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

看来我错了:(

此示例显示在教程中:

instance Monad [] where
   xs >>= f = concat . map f $ xs

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



1> Tom Lokhorst..:

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

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)

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


要添加噪音:(>> =)= flip concatMap - =)
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有