我有一些 F# 代码,这些代码在 .net 下运行得很好,但在 Mono 下会溢出堆栈。一个相关的问题是,在其所拥有的堆栈空间耗尽之前,它似乎早就已经发生了。该代码通过使用 System.Threading.Thread (ts, 1000000000) 启动。据我所知,它死在的 fold 函数是尾递归的,并且堆栈跟踪看起来好像没有进行尾-优化。我使用 --optimize=tailc 运行的版本是 3.2.1。
请问有人确切地知道哪些尾调用可以删除调用堆栈,哪些不能?或者有什么方法可以分配更多的堆栈?非常感谢。
我了解Mono中的尾调用消除
编辑:如评论中要求的那样,以下是代码概述。它是对一个大型数据结构的折叠的一部分,但失败的堆栈跟踪只包含 mapk 和 myfold 两个函数。
let rec myfold f x k =
let rec mapk xs k =
match xs with
[] -> k []
| x::xs -> mapk xs (fun xs' -> myfold f x (fun x' -> (x' :: xs') |> k))
...
mapk (...) ( ... >> k)