我今天在玩 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.