我今天在玩 Haskell 时注意到,可以做类似的事情
($ 4) (> 3)
产生True
。这里发生了什么?有一些直觉会很棒。
我猜?看起来这($ 4)
是一个不完整的函数应用程序,但我感到困惑的是它$
是一个中缀运算符,所以它不应该是这样的(4 $)
吗?这不编译,很明显不是,这让我相信我并不真正理解发生了什么。这个(>3)
词对我来说很有意义,因为如果你提供类似的东西(\x -> x 4) (>3)
,你最终会得到相同的结果。
我今天在玩 Haskell 时注意到,可以做类似的事情
($ 4) (> 3)
产生True
。这里发生了什么?有一些直觉会很棒。
我猜?看起来这($ 4)
是一个不完整的函数应用程序,但我感到困惑的是它$
是一个中缀运算符,所以它不应该是这样的(4 $)
吗?这不编译,很明显不是,这让我相信我并不真正理解发生了什么。这个(>3)
词对我来说很有意义,因为如果你提供类似的东西(\x -> x 4) (>3)
,你最终会得到相同的结果。
($ 4)
就是所谓的section。这是一种部分应用中缀运算符的方法,但提供右侧而不是左侧。它完全等同于(flip ($) 4)
.
同样, (> 3) 是一个部分。
($ 4) (> 3)
可以改写为
(flip ($) 4) (> 3)
这与
flip ($) 4 (> 3)
这与
(> 3) $ 4
在这一点上,应该很清楚,这归结为(4 > 3)
.
您可以从任一侧部分应用中缀运算符。对于诸如 的交换运算符,你说or+
并不重要,但是例如对于除法,你可以提供除数或除数。(+ 1)
(1 +)
(5 /)
(/ 5)
函数应用运算符将函数作为左侧操作数,将参数作为右侧操作数 ( f $ x
),因此您可以将其部分应用于函数(f $)
或参数($ x)
。所以给定
($ 4) (> 3)
您首先部分应用带有参数的 $-operator4
并使用 function 提供它(> 3)
。所以这基本上变成了
(> 3) $ 4
这与(4 > 3)
.
($ 4)
是接受一个函数并应用于4
它的函数。
(> 3)
是接受一个数字并检查它是否大于 3 的函数。
因此,通过将后一个函数提供给前者,您实际上是在应用4
检查其输入是否大于 的函数,3
因此您得到True
.