10

我今天在玩 Haskell 时注意到,可以做类似的事情

($ 4) (> 3)

产生True。这里发生了什么?有一些直觉会很棒。

我猜?看起来这($ 4)是一个不完整的函数应用程序,但我感到困惑的是它$是一个中缀运算符,所以它不应该是这样的(4 $)吗?这不编译,很明显不是,这让我相信我并不真正理解发生了什么。这个(>3)词对我来说很有意义,因为如果你提供类似的东西(\x -> x 4) (>3),你最终会得到相同的结果。

4

3 回答 3

19

($ 4)就是所谓的section。这是一种部分应用中缀运算符的方法,但提供右侧而不是左侧。它完全等同于(flip ($) 4).

同样, (> 3) 是一个部分。

($ 4) (> 3)

可以改写为

(flip ($) 4) (> 3)

这与

flip ($) 4 (> 3)

这与

(> 3) $ 4

在这一点上,应该很清楚,这归结为(4 > 3).

于 2012-05-07T05:06:11.180 回答
12

您可以从任一侧部分应用中缀运算符。对于诸如 的交换运算符,你说or+并不重要,但是例如对于除法,你可以提供除数或除数。(+ 1)(1 +)(5 /)(/ 5)

函数应用运算符将​​函数作为左侧操作数,将参数作为右侧操作数 ( f $ x),因此您可以将其部分应用于函数(f $)或参数($ x)。所以给定

($ 4) (> 3)

您首先部分应用带有参数的 $-operator4并使用 function 提供它(> 3)。所以这基本上变成了

(> 3) $ 4

这与(4 > 3).

于 2012-05-07T05:12:09.390 回答
6

($ 4)是接受一个函数并应用于4它的函数。

(> 3)是接受一个数字并检查它是否大于 3 的函数。

因此,通过将后一个函数提供给前者,您实际上是在应用4检查其输入是否大于 的函数,3因此您得到True.

于 2012-05-08T00:33:20.053 回答