非尾递归的递归生成的数组参与运算会是lazy的吗?
今天突然想到的问题。
对于尾递归,比如 foo = 0 : foo , take 3 foo 肯定是 lazy 的, foo 不会执行超过 3 次。
但对于 foo = sequence ((return 0) : foo) , take 3 foo 如何优化为 lazy 呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
对,就是这样。
工程实践和搞科研不同,
用 90% 的精力去搞出 10% 的成绩,不值得。
只能说明这个问题暂时可以不用过于深入的考虑,说明不了没有问题。自己举不出实际例子并不代表别人也举不出来嘛。
其实有一种思维方法,
就是:
这时候,举一个真实的例子出来。
你举不出例子来,就说明没问题。
我是前一两年学会这种思维方法的,
在编程实践中可以有效地防止过度设计。
只是举例而已,不表示一定要是错误的程序才有这问题。
这就属于程序的逻辑问题了。
这个是直接调用readFile之类的情况,如果自行hGetLine,并且逻辑不合适的话,很可能导致不能lazy。
现在的文件读取就是按需读取的,也不是全部读入。
这个呢
foo 0 = []
foo a = foo (a - 1) : a
问题是这个是可以优化为尾递归的,虽然我不知道编译器是否能优化。
而且很多时候之所以不能优化,原因就是有IO。几十万行的文本不lazy效率糟了……
[ 本帖最后由 Magicloud 于 2009-4-8 12:52 编辑 ]
我觉得你还是想个不用 monad 的例子吧,当有 monad 的时候,许多问题都不是那么简单了。