【问题标题】:Tailcalls in MonoMono 中的尾调用
【发布时间】: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


【解决方案1】:

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

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

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

  • File a bug report with Xamarin
  • 访问 #monodev IRC 频道(在 irc.gnome.org 上),看看那里的开发人员/贡献者是否可以帮助您。

【讨论】:

  • Tailc 是一个 Mono“优化”选项。我在运行 F# 时使用 --tailcalls。我怀疑提交错误报告会适得其反,因为众所周知 Mono 不能完全正确地进行尾声(或者直到最近才如此)。但是,如果有人确切地知道现有支持何时有效,何时无效,那将是很大的帮助。
  • 如果您不提交错误,那么任何人都知道如何修复它?
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多