Stack overflow despite tail call position but only in 64-bit 问题导致在 F# 编译器中发现 bug。
阅读 answer 后,我很好奇导致发现错误的原因,因为我想更好地提高解决问题和理解 TCO 的技能。
最佳答案
我的推理是这样的:
在查看计算表达式时谈论“尾调用”可能会产生误导 - 一般情况下确实没有这样的事情(参见例如 this other answer 的一个相关讨论,尽管与序列表达式无关)。
因此,调用 gauss
本身不会使堆栈溢出,只有遍历它的代码才能使其溢出。但是一旦我看到调用代码就像 Seq.nth
一样,这意味着几乎可以肯定存在编译器错误,因为序列表达式中的“tail yield!
ing”模式应该得到优化(不确定这是否是一部分规范,但我认为它是众所周知的)。因此,这只是看看初始复制的哪些部分是必要的。
用非递归定义替换原始代码中的循环会使重现停止失败,删除模式匹配也是如此。我没有发现查看 IL 有帮助(在序列表达式的编译中涉及很多编译器生成的机器),我只是尝试在源代码级别最小化再现并凭经验测试行为。
关于f# - 什么推理导致 `Sequence expression containing recursive definition is compiled incorrectly`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35799031/