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
Function Haskell函数组合方法_Function_Haskell_Functional Programming_Composition - Fatal编程技术网

Function Haskell函数组合方法

Function Haskell函数组合方法,function,haskell,functional-programming,composition,Function,Haskell,Functional Programming,Composition,我刚开始在大学学习Haskell,在玩它的时候,我偶然发现了一个我似乎无法理解的问题。 以下代码给出了所需的结果: import Data.List list = ["Hello", "world"] main = print $ intercalate " something " (reverse (map reverse list)) 输出: "dlrow something olleH" 但是我想用点而不是括号来编写“main”函数,所以它尝试了: main = print $ in

我刚开始在大学学习Haskell,在玩它的时候,我偶然发现了一个我似乎无法理解的问题。 以下代码给出了所需的结果:

import Data.List
list = ["Hello", "world"]

main = print $ intercalate " something " (reverse (map reverse list))
输出:

"dlrow something olleH"
但是我想用点而不是括号来编写“main”函数,所以它尝试了:

main = print $ intercalate " something " . reverse . map reverse list
但是,这给了我以下错误:

test.hs:5:54: error:
    • Couldn't match expected type ‘a0 -> [[Char]]’
                  with actual type ‘[[Char]]’
    • Possible cause: ‘map’ is applied to too many arguments

我认为这些点和括号的意思完全一样:函数合成。为什么括号起作用,而点给我一个与类型相关的错误?任何帮助都将不胜感激

使用
组合函数意味着函数将有另一个参数。如果你写了下面的内容,它会有用的

main=print$(插入“某物”.reverse.map reverse)列表

这样,
列表
值就是括号内函数的参数。

函数组合的等价性如下所示:

main = print (intercalate " something " (reverse (map reverse list)))
main = print (intercalate " something " ((reverse . map reverse) list))
main = print ((intercalate " something " . (reverse . map reverse)) list)
main = (print . (intercalate " something " . (reverse . map reverse))) list
或者,删除不必要的括号:

main = (print . intercalate " something " . reverse . map reverse) list
main = print . intercalate " something " . reverse . map reverse $ list

在您的尝试中,
map reverse list
是一个表达式,中缀
运算符的参数不起作用-您只能组合
map reverse
函数,然后将整个组合函数应用于
list
参数。

方括号并不表示函数组合。它们的意思是“将这个子表达式分组”。当然,您可以使用它们来创建一个函数组合链:下面将
c
定义为函数
f
g
h

c x = f (g (h x))
这也可以写成:

c = f . g . h
这样,你就可以写作了

但是如果你再次内联
c
,你需要小心不要弄乱解析规则:仅仅把
列表
写在合成链的右边是不行的,因为函数应用程序绑定比任何中缀操作符(包括
,尽管这实际上是最紧密的中缀操作符)都要紧密。即

实际上被解析为

(intercalate " something ") . (reverse) . (map reverse list)
((intercalate " something ") . (reverse) . (map reverse)) (list)
但那不是你想要的。您需要确保
list
实际上是整个合成链的参数,而不仅仅是它的最后一个元素;执行此操作的首选方法是使用
$
运算符:

intercalate " something " . reverse . map reverse $ list
$
的优先级最低,因此将其解析为

(intercalate " something ") . (reverse) . (map reverse list)
((intercalate " something ") . (reverse) . (map reverse)) (list)
或者,您可以立即将
map reverse
应用于
list
——这本身并没有错,只是结果不再是合成链的一部分:

intercalate " something " . reverse $ map reverse list

这实际上很有道理。非常感谢!非常感谢Bergi的回复,现在有意义了!