8

我在 F# 中有一些代码在 .net 下运行良好,但在 Mono 下会溢出堆栈。一个相关的问题是,它似乎在它应该可用的堆栈空间用完之前很久(它以 System.Threading.Thread (ts, 1000000000) 开始)。据我所知,它死亡的折叠是尾递归的,堆栈跟踪看起来好像没有进行尾优化。我正在使用 --optimize=tailc 运行 3.2.1。

有人请确切知道哪些尾调用会删除调用堆栈,哪些不会?或者如何分配更多的堆栈?非常感谢。

我知道Mono 中的 Tailcall 消除

编辑:这是评论中要求的代码大纲。它是大型数据结构折叠的一部分,但失败的堆栈跟踪只有 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)
4

1 回答 1

1

据我所知,--optimize=tailc不是受支持的 F# 编译器标志。

我认为没有办法在 Mono 中启用/禁用尾调用优化支持(无论如何,从命令行);启用尾调用优化的 F# 编译器标志是--tailcalls+,但根据默认情况下打开的编译器选项 (F#)

我认为解决此问题的最佳选择是:

于 2013-08-26T19:02:58.383 回答