Haskell编程中有折叠函数代码。
map' ::(a->b)->[a]->[b]
map' f xs=foldr(\x acc ->f x:acc)[] xs
INPUT:
map' (+3) [1,2,3]
输出:
[4,5,6]
由于foldr函数,它从右侧获取元素,我想从左侧获取元素并追加到列表中,我想要一个输出[6,5,4] .i通过foldl函数完成但它给出了错误。
ERROR: Couldn't match expected type `a' with actual type `[b]'
`a' is a rigid type variable bound by
the type signature for map' :: (a -> b) -> [a] -> [b]
at doubleme.hs:1:8
In the first argument of `f', namely `x'
In the first argument of `(:)', namely `f x'
In the expression: f x : acc
答案 0 :(得分:2)
将您的功能签名更改为map' ::(a->b)->[a]->[b]
。
map
操作基本上采用一种函数,将类型为'a'的元素转换为类型'b'的元素,以及类型'a'的元素列表,以生成元素列表使用转换函数键入'b'。包含另一个类型'c'的函数签名与此相反,因为'b'和'c'不能隐含地假设为相同的类型。
接下来,要使用foldl
,您必须颠倒输入参数的顺序,如下所示:
map' :: (a->b)->[a]->[b]
map' f xs = foldl (\acc x ->f x:acc) [] xs