Haskell 从具有依赖值的函数中删除显式递归
我有以下使用显式递归的Haskell函数:Haskell 从具有依赖值的函数中删除显式递归,haskell,recursion,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 [] = [] 请注意,递归调用取决于之前步骤中计算的值(byg) 有没有办法删除显式递归?如果有,如何删除?使用尾部递归,ghc可以优化它 f (a:b:xs) acc = f (g a b : xs) (g a b : a
f :: [a] -> [a]
f (a:b:xs) = g a b : f (g a b : xs)
where
g :: a -> a -> a
f (_:[]) = []
f [] = []
请注意,递归调用取决于之前步骤中计算的值(byg
)
有没有办法删除显式递归?如果有,如何删除?使用尾部递归,ghc可以优化它
f (a:b:xs) acc = f (g a b : xs) (g a b : acc)
f _ acc = reverse acc
这样说吧
f myList []
您的函数正是一个发出中间值的折叠。在哈斯克尔,这被称为一个。具体来说,除了第一个元素外,它与您的
f
等效
f = drop 1 . scanl1 g
基本情况是什么?请参阅我的编辑。我想我添加了它们。我需要
尾部
,因为否则它将是f(a:b:xs)=a:gab:f(gab:xs)
,对吗?Sven,类似的东西。scanl1在不应用g的情况下输出第一个元素raw,而f跳过它。甘尼什,我会解决的。忘了tail不能处理空列表。