gpt4 book ai didi

f# - Mono 中的尾调用

转载 作者:行者123 更新时间:2023-12-04 08:52:33 25 4
gpt4 key购买 nike

我在 F# 中有一些代码在 .net 下工作正常,但在 Mono 下溢出堆栈。一个相关的问题是,它似乎在据称可用的堆栈空间耗尽之前很久就这样做了(它以 System.Threading.Thread (ts, 1000000000) 开始)。据我所知,它消失的折叠是尾递归的,堆栈跟踪看起来好像没有进行尾优化。我正在使用 --optimize=tailc 运行 3.2.1。

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

我知道 Tailcall elimination in Mono

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

最佳答案

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

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

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

  • File a bug report with Xamarin
  • 访问 #monodev IRC channel (在 irc.gnome.org 上),看看那里的开发人员/贡献者之一是否可以帮助您。
  • 关于f# - Mono 中的尾调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18450533/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com