【发布时间】:2021-04-27 20:48:51
【问题描述】:
我是 Haskell 的新手,从第一原理开始阅读 Haskell, 在第 384 页的 Folds 章节中,我遇到了 FoldR 并且似乎它不是尾递归的
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
1- 我们可以让它尾递归吗?
2- 会不会被优化?
【问题讨论】:
-
不知道为什么人们不赞成,因为这是一个完全合理的问题。但是,正如答案正确指出的那样,“尾递归”在 Haskell 中并不是那么相关。您更担心 thunk 的存储空间(这是
foldl在客观上比foldl'更糟糕的一个重要原因,尽管可以以直接的方式递归地实现这两个尾部。 -
也不知道为什么这被否决了——而且我认为这并不是给出的性能问题的重复。恕我直言,这个问题和答案很好,而且独立存在,所以我想投票重新开放这个问题。可悲的是,这会立即重新打开它,我不想把它变成关闭/重新打开战争那么其他人怎么看?
-
@Carsten 的答案在这里似乎有些不同。
标签: haskell optimization ghc tail-recursion fold