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,中的第一个问题是查找列表的最后一个元素。我提出了两个解决方案: 解决方案1:这是可行的 解决方案2这不起作用 问题: 为什么解决方案1有效,而解决方案2无效?我最困惑的是这两个实现如何提供模式匹配。 在本例中,应用程序$大致用于函数及其参数之间的列表,而在组合时。在两个函数之间使用 关于模式匹配:在第一种解决方案中,函数reverse将为您执行所需的模式匹配,因此myLast不必执行。大致上,在函数和它的参数之间使用application$,在这种情况下,当组合时使用列表。在两个函数之间使用 关

中的第一个问题是查找列表的最后一个元素。我提出了两个解决方案:

解决方案1:这是可行的

解决方案2这不起作用

问题:

为什么解决方案1有效,而解决方案2无效?我最困惑的是这两个实现如何提供模式匹配。 在本例中,应用程序$大致用于函数及其参数之间的列表,而在组合时。在两个函数之间使用

关于模式匹配:在第一种解决方案中,函数reverse将为您执行所需的模式匹配,因此myLast不必执行。

大致上,在函数和它的参数之间使用application$,在这种情况下,当组合时使用列表。在两个函数之间使用

关于模式匹配:在第一种解决方案中,函数reverse将为您执行所需的模式匹配,因此myLast不必执行。

head是一个argument1的函数。如果你用f$x把一个函数应用到某个东西上,这和简单地写fx是一样的,或者如果你喜欢fx,或者fx,都是一样的。。。更难看的是:参数由指定的变量填充。所以head$reverse的结果就是head在输入reverse类型的参数时给出的结果。。。但这不起作用,因为head需要一个列表,而reverse是一个函数它本身并不关心这一点,而是直接处理参数,例如,您可以编写

序曲>:t映射$reverse 映射$reverse::[[a]]->[[a]]

因为map的第一个参数实际上是一个函数

有。不一样。它关心的是右边的参数的类型也必须是一个函数,而不是直接将它输入左边的函数。相反,f。g生成另一个函数,该函数执行以下操作:它等待某个参数x,并将其馈送给g,然后将该参数的结果馈送给f

现在,如果你写信

myLast' = head . reverse
它的意思是,将myLast定义为这个函数。给你作为正面和反面的构图。这里没有提到myLast的参数并不重要:[a]->a只是某种类型,因此您可以使用类似myLast的类型定义变量,方法是将变量赋给恰好具有类似head这样的函数类型的值。颠倒如果需要,可以将参数显式化:

myLast'' x = (head . reverse) x
注意,paren是必需的,因为否则它将被解析为head。reverse x–这不起作用,因为reverse x不再是一个函数,只是一个结果列表。所以你不能用头来作曲;但是,您可以做的是将头部应用于它:

1事实上,Haskell中的每个函数只有一个参数。。。但是对于+::Int->Int->Int,我们说的是两个参数函数,虽然实际上这是一个单参数函数,返回一个Int:+::Int->Int->Int。head是一个单参数函数。如果你用f$x把一个函数应用到某个东西上,这和简单地写fx是一样的,或者如果你喜欢fx,或者fx,都是一样的。。。更难看的是:参数由指定的变量填充。所以head$reverse的结果就是head在输入reverse类型的参数时给出的结果。。。但这不起作用,因为head需要一个列表,而reverse是一个函数它本身并不关心这一点,而是直接处理参数,例如,您可以编写

序曲>:t映射$reverse 映射$reverse::[[a]]->[[a]]

因为map的第一个参数实际上是一个函数

有。不一样。它关心的是右边的参数的类型也必须是一个函数,而不是直接将它输入左边的函数。相反,f。g生成另一个函数,该函数执行以下操作:它等待某个参数x,并将其馈送给g,然后将该参数的结果馈送给f

现在,如果你写信

myLast' = head . reverse
它的意思是,将myLast定义为这个函数。给你作为正面和反面的构图。这里没有提到myLast的参数并不重要:[a]->a只是某种类型,因此您可以使用类似myLast的类型定义变量,方法是将变量赋给恰好具有类似head这样的函数类型的值。颠倒如果需要,可以将参数显式化:

myLast'' x = (head . reverse) x
注意,paren是必需的,因为否则它将被解析为head。reverse x–这不起作用,因为reverse x不再是一个函数,只是一个结果列表。所以你不能用头来作曲;但是,您可以做的是将头部应用于它:

1事实上,Haskell中的每个函数只有一个参数。。。但是对于+::Int->Int->Int,我们说的是两个参数的函数,虽然实际上这是一个单参数函数,返回一个Int:+::Int->Int->Int

myLast''' x = head $ reverse x