Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从具有依赖值的函数中删除显式递归_Haskell_Recursion - Fatal编程技术网

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

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

f :: [a] -> [a]
f (a:b:xs) = g a b : f (g a b : xs)
  where
    g :: a -> a -> a
f (_:[])   = []
f []       = []
请注意,递归调用取决于之前步骤中计算的值(by
g


有没有办法删除显式递归?如果有,如何删除?

使用尾部递归,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不能处理空列表。