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中的Foldr和Foldl函数_Haskell - Fatal编程技术网

haskell中的Foldr和Foldl函数

haskell中的Foldr和Foldl函数,haskell,Haskell,Haskell编程中有fold函数的代码 map' ::(a->b)->[a]->[b] map' f xs=foldr(\x acc ->f x:acc)[] xs 输入: map' (+3) [1,2,3] 输出: [4,5,6] 由于foldr函数,它从右边获取元素,我想从左边获取元素并附加到列表中,我想要一个输出[6,5,4]。我通过foldl函数进行了此操作,但它给出了错误 错误:无法将预期类型“a”与实际类型“b”匹配 `a'是一个刚性类型变量,由 映射

Haskell编程中有fold函数的代码

map' ::(a->b)->[a]->[b]
map' f xs=foldr(\x acc ->f x:acc)[] xs
输入:

map' (+3) [1,2,3]
输出:

[4,5,6]
由于foldr函数,它从右边获取元素,我想从左边获取元素并附加到列表中,我想要一个输出[6,5,4]。我通过foldl函数进行了此操作,但它给出了错误

错误:无法将预期类型“a”与实际类型“b”匹配
`a'是一个刚性类型变量,由
映射“:(a->b)->[a]->[b]的类型签名
在doubleme。hs:1:8
在'f'的第一个参数中,即'x'
在“(:)”的第一个参数中,即“fx”
在表达式中:fx:acc

将函数签名更改为
map'::(a->b)->[a]->[b]

map
操作基本上采用一个函数,该函数将“a”类型的元素转换为“b”类型的元素,并使用转换函数生成“a”类型的元素列表。包含另一类型“c”的函数签名与此相反,因为不能隐式假定“b”和“c”为同一类型

接下来,要使用
foldl
,必须颠倒输入参数的顺序,如下所示:

map' :: (a->b)->[a]->[b]
map' f xs = foldl (\acc x ->f x:acc) [] xs

您得到的实际错误是什么?谢谢,它是有效的。但是它是如何正确的,我的方法是错误的。请看一下这篇文章,看看
foldl
foldr
是如何工作的,您将看到为什么需要交换参数的位置: