Joe*_*uha 8 mono f# tail-recursion
我在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)
Run Code Online (Sandbox Code Playgroud)
据我所知,--optimize=tailc
这不是受支持的 F# 编译器标志。
我认为没有办法在 Mono 中启用/禁用尾部调用优化支持(无论如何,从命令行);启用尾部调用优化的 F# 编译器标志是--tailcalls+
,但根据编译器选项 (F#),默认情况下该标志处于打开状态。
我认为解决这个问题的最佳选择是: