Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么`($4)(>;3)`等于`4>;3`?_Haskell - Fatal编程技术网

Haskell 为什么`($4)(>;3)`等于`4>;3`?

Haskell 为什么`($4)(>;3)`等于`4>;3`?,haskell,Haskell,我注意到,当我今天和Haskell在一起玩的时候,有可能做类似的事情 ($ 4) (> 3) 这将产生True。这是怎么回事?有点直觉就好了 我猜呢?看起来($4)是一个不完整的函数应用程序,但我感到困惑的是$是一个中缀运算符,所以它不应该看起来像(4$)?这没有编译,所以很明显没有,这让我相信我真的不明白发生了什么。(>3)这个术语对我来说很有意义,因为如果你提供类似于(\x->x 4)(>3)的东西,你会得到同样的结果。($4)就是所谓的。这是一种部分应用中缀运算符的方法,但提供右侧

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

($ 4) (> 3)
这将产生
True
。这是怎么回事?有点直觉就好了

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

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

类似地,(>3)是一个部分

($ 4) (> 3)
可以重写为

(flip ($) 4) (> 3)
flip ($) 4 (> 3)
这和

(> 3) $ 4
这和

(> 3) $ 4

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

您可以从任意一侧部分应用中缀运算符。对于诸如
+
之类的交换运算符,如果您说
(+1)
(1+)
,则无关紧要,但例如对于除法,您可以提供除数
(5/)
或除数
(/5)

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

($ 4) (> 3)
首先使用参数
4
部分应用$-运算符,并为其提供函数
(>3)
。所以这本质上变成了

(> 3) $ 4
(4>3)
($4)
相同的是接受函数并将其应用于
4
的函数

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


因此,通过将后一个函数赋予前一个函数,您实际上是将
4
应用于检查其输入是否大于
3
,从而得到
True
,答案非常好,但我想补充一点,
(`op`e)
(\x->x`op`e)
(e`op`)的语法糖
用于
(\x->e`op`x)
,其中
`op`
是运算符(普通运算符,如
+
-
等,或反勾中的函数)。将
(f$)
读作“调用函数f”;将
($4)
读为“以4为参数调用”。“4”的呼叫大于3吗?是“4大于3吗?”
($4)(>3)=(>3)4==4>3==(4>)3
@apc:如果您不太熟悉部分应用程序,请注意类型签名
add::Int->Int->Int
可以更明确地写成
add::Int->(Int->Int)
,即。“add是一个函数,它接受
Int
并返回一个函数
Int->Int
。还有谷歌“currying haskell”。谢谢@jberryman。我确实知道这一点,但幸好你向其他人提到了这一点@apc:我还想指出,
(>3)
也是一个部分,您解析它的方式与解析
($4)
的方式完全相同。