作为练习,我正在尝试编写一个与foldl函数行为相同的函数,并且我也尝试使用递归。
我的函数将被调用,“leftFolder”,签名将看起来像foldl函数:
leftFolder :: (a -> b -> a) -> a -> [b] -> a
我有点想做什么,但这就是我尝试过的事情:
leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder [] = []
leftFolder (x:xs) = x (++) (leftFolder xs)
在我看来,这是有道理的。我是说如果列表为空,则返回一个空列表。如果不是,那就拿下列表的头部,然后继续将它附加到尾部。
答案 0 :(得分:3)
您的代码存在很多问题。例如:
[]
,而第一个参数应该是一个函数x (++) ...
毫无意义;您可能打算使用x:...
我相信你要找的是:
leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs
即:如果列表为空,则返回第二个位置的累计值。否则,我们计算新的累积值(fn c x
),然后将其作为第二个参数传递给我们的函数,同时转发fn
并传递列表的其余部分。