问题尽管尾调用位置存在堆栈溢出,但仅限 64 位 https://stackoverflow.com/q/35751350/1243762导致发现一个bug https://github.com/Microsoft/visualfsharp/issues/996在 F# 编译器中。
读完后answer https://stackoverflow.com/a/35776618/1243762我很好奇找到 bug 的原因,因为我想更好地提高解决问题和理解 TCO 的技能。
我的推理是这样的:
在查看计算表达式时谈论“尾部调用”可能会产生误导 - 一般来说,确实没有这样的事情(参见例如这个另一个答案 https://stackoverflow.com/a/6615060/82959对于一项相关的讨论,尽管与sequence表达式)。
所以打电话gauss
堆栈本身不会溢出,只有迭代它的代码才会使其溢出。但是当我看到调用代码就像这样Seq.nth
,这意味着几乎可以肯定存在编译器错误,因为“tail”的模式yield!
序列表达式中的“ing”应该得到优化(不确定这是否是规范的一部分,但我认为这是众所周知的)。所以这只是看看初始重现的哪些部分是必要的。
用非递归定义替换原始代码中的循环使重现停止失败,删除模式匹配也是如此。我没有发现查看 IL 有帮助(序列表达式的编译涉及到很多编译器生成的机制),我只是尝试最小化源代码级别的重现并凭经验测试行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)