繁体   English   中英

Haskell中的Foldr和Foldl函数

[英]Foldr and Foldl function in haskell

Haskell编程中有折叠功能的代码。

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

INPUT:

map' (+3) [1,2,3]

OUTPUT:

[4,5,6]

由于使用了foldr函数,它从右侧获取了元素,我想从左侧获取该元素并追加到列表中,并且我想要一个输出[6,5,4]。我通过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

将您的函数签名更改为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM