考虑以下 ghci 中的函数定义。
let myF = sin . cos . sum
在哪里, 。代表两个函数的组合(右结合)。这个我可以打电话
myF [3.14, 3.14]
它给了我想要的结果。显然,它将列表 [3.14, 3.14] 传递给函数“sum”,并将其“结果”传递给 cos 等等。但是,如果我在口译员中这样做
let myF y = sin . cos . sum y
或者
let myF y = sin . cos (sum y)
然后我遇到了麻烦。将其修改为以下内容给了我想要的结果。
let myF y = sin . cos $ sum y
或者
let myF y = sin . cos . sum $ y
(.) 的类型表明以下形式不应该有问题,因为 'sum y' 也是一个函数(不是吗?毕竟在 Haskell 中一切都是函数?)
let myF y = sin . cos . sum y -- this should work?
更有趣的是,我可以使用两个(或多个)参数(考虑将列表 [3.14, 3.14] 作为两个参数 x 和 y 传递),我必须编写以下内容
let (myF x) y = (sin . cos . (+ x)) y
myF 3.14 3.14 -- it works!
let myF = sin . cos . (+)
myF 3.14 3.14 -- -- Doesn't work!
HaskellWiki 上有一些关于这种形式的讨论,他们称之为“PointFree”形式http://www.haskell.org/haskellwiki/Pointfree。通过阅读这篇文章,我怀疑这种形式不同于两个 lambda 表达式的组合。当我尝试画一条分隔这两种样式的线时,我感到困惑。