我有一个.NET 4.0应用程序,它大量使用尾递归(用F#编程).它在.NET VM上运行良好,但在Mono-3.0.1上运行时没有堆栈.
我试过跑步,mono --optimize=tailc但似乎没有改变任何东西.
有没有办法强制单声道消除尾部呼叫?有没有办法增加单声道的最大堆栈大小?
像这样的简单追加函数(在F#中):
let rec app s t =
match s with
| [] -> t
| (x::ss) -> x :: (app ss t)
Run Code Online (Sandbox Code Playgroud)
当s变大时会崩溃,因为函数不是尾递归的.我注意到F#的标准追加功能不会因大列表而崩溃,因此必须以不同方式实现.所以我想知道:追尾的尾递归定义怎么样?我提出了这样的事情:
let rec comb s t =
match s with
| [] -> t
| (x::ss) -> comb ss (x::t)
let app2 s t = comb (List.rev s) t
Run Code Online (Sandbox Code Playgroud)
哪个有效,但看起来很奇怪.是否有更优雅的定义?