非尾递归的递归生成的数组参与运算会是lazy的吗?

发布于 2022-08-13 11:16:13 字数 151 浏览 11 评论 9

今天突然想到的问题。
对于尾递归,比如 foo = 0 : foo , take 3 foo 肯定是 lazy 的, foo 不会执行超过 3 次。
但对于 foo = sequence ((return 0) : foo) , take 3 foo 如何优化为 lazy 呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

待"谢繁草 2022-08-22 01:56:10

原帖由 MMMIX 于 2009-4-9 16:48 发表

只能说明这个问题暂时可以不用过于深入的考虑,说明不了没有问题。自己举不出实际例子并不代表别人也举不出来嘛。

对,就是这样。
工程实践和搞科研不同,
用 90% 的精力去搞出 10% 的成绩,不值得。

那请放手 2022-08-22 01:56:04

原帖由 flw 于 2009-4-9 15:12 发表

其实有一种思维方法,
就是:

这时候,举一个真实的例子出来。
你举不出例子来,就说明没问题。

只能说明这个问题暂时可以不用过于深入的考虑,说明不了没有问题。自己举不出实际例子并不代表别人也举不出来嘛。

拒绝两难 2022-08-22 01:55:39

原帖由 Magicloud 于 2009-4-9 15:10 发表

只是举例而已,不表示一定要是错误的程序才有这问题。

其实有一种思维方法,
就是:

这时候,举一个真实的例子出来。
你举不出例子来,就说明没问题。

我是前一两年学会这种思维方法的,
在编程实践中可以有效地防止过度设计。

笑饮青盏花 2022-08-22 01:30:29

原帖由 MMMIX 于 2009-4-8 16:45 发表

这就属于程序的逻辑问题了。

只是举例而已,不表示一定要是错误的程序才有这问题。

浮生面具三千个 2022-08-22 00:47:00

原帖由 Magicloud 于 2009-4-8 15:10 发表

这个是直接调用readFile之类的情况,如果自行hGetLine,并且逻辑不合适的话,很可能导致不能lazy。

这就属于程序的逻辑问题了。

情泪▽动烟 2022-08-21 17:01:48

原帖由 MMMIX 于 2009-4-8 14:09 发表

现在的文件读取就是按需读取的,也不是全部读入。

这个是直接调用readFile之类的情况,如果自行hGetLine,并且逻辑不合适的话,很可能导致不能lazy。

亢潮 2022-08-21 14:46:11

原帖由 Magicloud 于 2009-4-8 12:49 发表

这个呢
foo 0 = []
foo a = foo (a - 1) : a
问题是这个是可以优化为尾递归的,虽然我不知道编译器是否能优化。
而且很多时候之所以不能优化,原因就是有IO。几十万行的文本不lazy效率糟了……

现在的文件读取就是按需读取的,也不是全部读入。

静谧 2022-08-21 10:29:30

原帖由 MMMIX 于 2009-4-8 12:17 发表

我觉得你还是想个不用 monad 的例子吧,当有 monad 的时候,许多问题都不是那么简单了。

这个呢
foo 0 = []
foo a = foo (a - 1) : a
问题是这个是可以优化为尾递归的,虽然我不知道编译器是否能优化。
而且很多时候之所以不能优化,原因就是有IO。几十万行的文本不lazy效率糟了……

[ 本帖最后由 Magicloud 于 2009-4-8 12:52 编辑 ]

鼻尖触碰 2022-08-21 04:02:27

原帖由 Magicloud 于 2009-4-8 11:19 发表
今天突然想到的问题。
对于尾递归,比如 foo = 0 : foo , take 3 foo 肯定是 lazy 的, foo 不会执行超过 3 次。
但对于 foo = sequence ((return 0) : foo) , take 3 foo 如何优化为 lazy 呢?

我觉得你还是想个不用 monad 的例子吧,当有 monad 的时候,许多问题都不是那么简单了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文