haskell中的Foldr和Foldl函数

时间:2015-02-14 14:36:38

标签: haskell

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

1 个答案:

答案 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