使用函数像foldl递归

时间:2015-01-17 21:15:21

标签: haskell

作为练习,我正在尝试编写一个与foldl函数行为相同的函数,并且我也尝试使用递归。

我的函数将被调用,“leftFolder”,签名将看起来像foldl函数:  leftFolder :: (a -> b -> a) -> a -> [b] -> a

我有点想做什么,但这就是我尝试过的事情:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder [] = []
leftFolder (x:xs) = x (++) (leftFolder xs)

在我看来,这是有道理的。我是说如果列表为空,则返回一个空列表。如果不是,那就拿下列表的头部,然后继续将它附加到尾部。

1 个答案:

答案 0 :(得分:3)

您的代码存在很多问题。例如:

  • 你是模式匹配作为第一个参数[],而第一个参数应该是一个函数
  • 您只使用1个参数而不是您要求的3个
  • x (++) ...毫无意义;您可能打算使用x:...
  • 在第一个模式匹配中,您返回一个列表,而您的函数的返回类型不一定是列表

我相信你要找的是:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs

Live demo

即:如果列表为空,则返回第二个位置的累计值。否则,我们计算新的累积值(fn c x),然后将其作为第二个参数传递给我们的函数,同时转发fn并传递列表的其余部分。