【发布时间】:2013-08-26 18:24:58
【问题描述】:
我在 F# 中有一些代码在 .net 下运行良好,但在 Mono 下会溢出堆栈。一个相关的问题是它似乎在它应该可用的堆栈空间用完之前很久(它以 System.Threading.Thread (ts, 1000000000) 开始)。据我所知,它的折叠是尾递归的,堆栈跟踪看起来好像没有进行尾优化。我正在使用 --optimize=tailc 运行 3.2.1。
请问有人确切知道哪些尾调用会删除调用堆栈,哪些不会?或者如何分配更多的堆栈?非常感谢。
我知道Tailcall elimination in Mono
编辑:这里是 cmets 中要求的代码大纲。它是大型数据结构折叠的一部分,但失败的堆栈跟踪只有 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)
【问题讨论】:
-
您在哪个平台上运行 Mono? (FreeBSD?OS X?Linux?)
-
Linux。具有 64G RAM 的 8 核 AMD 机器,如果这有所作为的话。
-
你有什么样的尾递归函数?它是调用自己,还是调用其他函数? (或者它是否使用延续?)(我只是想弄清楚可能出了什么问题——因为 F# 编译器实际上优化了一些尾调用。)
标签: f# mono tail-recursion