Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 它们之间有什么区别。和(.)在哈斯克尔?_Haskell - Fatal编程技术网

Haskell 它们之间有什么区别。和(.)在哈斯克尔?

Haskell 它们之间有什么区别。和(.)在哈斯克尔?,haskell,Haskell,我正在尝试编写一个管道函数,它从右边通过函数列表滚动一个值。函数如下所示: map . foldr (.) id 但我不明白它在这里干什么?我知道。是函数合成,但什么是函数合成。做什么?两者之间的区别。和与+和+、-和-,以及所有其他值之间的值相同: 如果没有括号,则表示符号,将操作数放在符号前后,如f中所示。g或3+5; 带括号的是函数应用程序窗体,其操作数都位于函数名之后,如中所示。或+35。 类似的情况也适用于具有普通名称的函数,例如myfunc。但是,在本例中,普通名称myfunc希

我正在尝试编写一个管道函数,它从右边通过函数列表滚动一个值。函数如下所示:

map . foldr (.) id 
但我不明白它在这里干什么?我知道。是函数合成,但什么是函数合成。做什么?

两者之间的区别。和与+和+、-和-,以及所有其他值之间的值相同:

如果没有括号,则表示符号,将操作数放在符号前后,如f中所示。g或3+5; 带括号的是函数应用程序窗体,其操作数都位于函数名之后,如中所示。或+35。 类似的情况也适用于具有普通名称的函数,例如myfunc。但是,在本例中,普通名称myfunc希望参数跟在它后面,就像.,而中缀形式是通过将名称放在反勾之间获得的

以下是一些等式示例:

Fg===。f g a+b====a+b a`fun`b===fun a b i`elem`l===elem i l 作为附加信息,即使函数包含两个以上的参数,如

func x y z=无论什么 您仍然可以使用中缀样式调用它,但是编写一个'func`b将为您提供一个函数,该函数使用一个与z对应的参数,就像您使用func ab一样。这是。示例:f=+3是有效的,它会产生一个函数f,该函数在传递给它的任何参数上加上3,例如f5==8。

两者之间的差异。和与+和+、-和-,以及所有其他值之间的值相同:

如果没有括号,则表示符号,将操作数放在符号前后,如f中所示。g或3+5; 带括号的是函数应用程序窗体,其操作数都位于函数名之后,如中所示。或+35。 类似的情况也适用于具有普通名称的函数,例如myfunc。但是,在本例中,普通名称myfunc希望参数跟在它后面,就像.,而中缀形式是通过将名称放在反勾之间获得的

以下是一些等式示例:

Fg===。f g a+b====a+b a`fun`b===fun a b i`elem`l===elem i l 作为附加信息,即使函数包含两个以上的参数,如

func x y z=无论什么
您仍然可以使用中缀样式调用它,但是编写一个'func`b将为您提供一个函数,该函数使用一个与z对应的参数,就像您使用func ab一样。这是。示例:f=+3是有效的,它会产生一个函数f,该函数将3添加到您传递给它的任何参数中,例如f 5==8。

正如@Enlico在他们的答案中所说的,形式为。不带括号的是中缀运算符。相比之下,这种形式。用括号表示函数。它接受另外两个函数作为参数并返回它们的组合

为说明如何应用于您的示例,请考虑您可能尝试的四种可能的变化:

地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 这些一开始看起来很相似。但在函数应用程序周围放上括号会揭示出不同之处:

地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件
换句话说:变体1运行id,然后将foldr应用于其结果,然后将map应用于该结果。显然,这是相当无用的,尤其是因为id为的组合不起任何作用。变体2是您所拥有的:它使用函数组合折叠列表-即使用函数:b->c->a->b->a->c-在将其结果作为map的第一个参数传递之前,使用id作为基本大小写,从而将这个新编写的函数映射到一个列表上。另一方面,变体3不仅没有意义,而且写得很糟糕:它不仅评估map。foldr,一个甚至不进行打字检查的表达式,然后它尝试用id来组合它,正如我已经提到的,id什么也不做。最后,变体4将函数映射应用于四个参数,即函数foldr。显然,变体2,也就是你所拥有的,是这里唯一有意义的。

正如@Enlico在他们的回答中所说的,形式。不带括号的是中缀运算符。相比之下,这种形式。用括号表示函数。它接受另外两个函数作为参数并返回它们的组合

为说明如何应用于您的示例,请考虑您可能尝试的四种可能的变化:

地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 这些一开始看起来很相似。但在函数应用程序周围放上括号会揭示出不同之处:

地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 地图福尔德。身份证件 换句话说:变体1运行id,然后将foldr应用于其结果,然后将map应用于该结果。显然,这是相当无用的,尤其是因为id为的组合
没什么。变体2是您所拥有的:它使用函数组合折叠列表-即使用函数:b->c->a->b->a->c-在将其结果作为map的第一个参数传递之前,使用id作为基本大小写,从而将这个新编写的函数映射到一个列表上。另一方面,变体3不仅没有意义,而且写得很糟糕:它不仅评估map。foldr,一个甚至不进行打字检查的表达式,然后它尝试用id来组合它,正如我已经提到的,id什么也不做。最后,变体4将函数映射应用于四个参数,即函数foldr。和id。很明显,变体2,即您所拥有的,是这里唯一有意义的。

请注意。不是Haskell的某种特殊的内置功能。这是一个普通的操作员。请注意。不是Haskell的某种特殊的内置功能。这是一个正常的操作员。@JiaqiShao,不,我不是这个意思。+例如,3是有效的,它会产生一个函数,在传递给它的任何参数上加上3。这是。我强烈建议你花些时间学习Haskell的基础知识。一开始是本好书。@JiaqiShao,不,我不是这个意思。+例如,3是有效的,它会产生一个函数,在传递给它的任何参数上加上3。这是。我强烈建议你花些时间学习Haskell的基础知识。这是一本好书。