haskell中的Foldr和Foldl函数
Haskell编程中有fold函数的代码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'是一个刚性类型变量,由 映射
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
是如何工作的,您将看到为什么需要交换参数的位置: