首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么% s ++ t不会导致大%s的堆栈溢出?

为什么% s ++ t不会导致大%s的堆栈溢出?
EN

Stack Overflow用户
提问于 2010-05-20 05:57:38
回答 1查看 656关注 0票数 16

我想知道为什么

代码语言:javascript
复制
Prelude> head $ reverse $ [1..10000000] ++ [99]
99

不会导致堆栈溢出错误。前奏中的++看起来是直接的、非尾部递归的:

代码语言:javascript
复制
(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys

编辑:最初,我认为这个问题与前奏中定义++的方式有关,特别是与重写规则有关,因此问题继续如下。讨论告诉我,事实并非如此。我认为现在一些懒惰的计算效果导致代码在没有堆栈溢出的情况下运行,但我不太清楚是如何实现的。

因此,就这样,它应该会遇到堆栈溢出,对吧?所以我认为这可能与遵循++定义的ghc魔力有关:

{对于所有的X,-#规则"++“~1。xs ++ ys =扩充(\c n -> foldr c n xs) ys #-}

*这是避免堆栈溢出的方法吗?有人能为这段代码中发生的事情提供一些提示吗?**

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2869750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档