为什么`($ 4)(> 3)`相当于`4> 3`?

apc*_*apc 10 haskell

我注意到今天我正在和Haskell一起玩,有可能做类似的事情

($ 4) (> 3)
Run Code Online (Sandbox Code Playgroud)

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

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

Lil*_*ard 19

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

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

($ 4) (> 3)
Run Code Online (Sandbox Code Playgroud)

可以改写为

(flip ($) 4) (> 3)
Run Code Online (Sandbox Code Playgroud)

这是一样的

flip ($) 4 (> 3)
Run Code Online (Sandbox Code Playgroud)

这是一样的

(> 3) $ 4
Run Code Online (Sandbox Code Playgroud)

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

  • @apc:如果你对部分应用程序不太熟悉,请注意类型签名`add :: Int - > Int - > Int`可以更明确地写成`add :: Int - >(Int - > Int )`,即"add是一个函数接受`Int`并返回一个函数`Int - > Int`.另外google"currying haskell". (5认同)

sha*_*ang 12

您可以从任何一方部分应用中缀运算符.对于交换运算符,例如+,如果你说(+ 1)或者无关紧要(1 +),但是例如对于除法,你可以提供被除数(5 /)或除数(/ 5).

函数应用程序运算符将函数作为左操作数,将参数作为右操作数(f $ x),因此可以使用函数(f $)或参数部分应用它($ x).所以给定

($ 4) (> 3)
Run Code Online (Sandbox Code Playgroud)

首先使用参数部分应用$ -operator 4并为其提供函数(> 3).所以这基本上变成了什么

(> 3) $ 4
Run Code Online (Sandbox Code Playgroud)

哪个是一样的(4 > 3).


Dan*_*ton 6

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

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

因此,通过将后一个函数赋予前者,您基本上应用于4检查其输入是否大于的函数,3从而得到True.