从具有相关值的函数中删除显式递归

时间:2014-01-10 10:15:02

标签: haskell recursion

我有以下Haskell函数,它使用显式递归:

f :: [a] -> [a]
f (a:b:xs) = g a b : f (g a b : xs)
  where
    g :: a -> a -> a
f (_:[])   = []
f []       = []

请注意,递归调用取决于之前步骤中计算的值(g)。

有没有办法删除显式递归?若然,怎么做?

2 个答案:

答案 0 :(得分:12)

您的功能正好是一个发出中间值的折叠。在Haskell中,这被称为scan。具体而言,scanl1相当于您的f,但第一个元素除外。

f = drop 1 . scanl1 g

答案 1 :(得分:-3)

使用尾递归,ghc可以优化它

f (a:b:xs) acc = f (g a b : xs) (g a b : acc)
f _ acc = reverse acc

并致电

f myList []