我在 F# 中有一些代码在 .net 下运行良好,但在 Mono 下会溢出堆栈。一个相关的问题是,它似乎在它应该可用的堆栈空间用完之前很久(它以 System.Threading.Thread (ts, 1000000000) 开始)。据我所知,它死亡的折叠是尾递归的,堆栈跟踪看起来好像没有进行尾优化。我正在使用 --optimize=tailc 运行 3.2.1。
有人请确切知道哪些尾调用会删除调用堆栈,哪些不会?或者如何分配更多的堆栈?非常感谢。
编辑:这是评论中要求的代码大纲。它是大型数据结构折叠的一部分,但失败的堆栈跟踪只有 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)