簡體   English   中英

單聲道的尾聲

[英]Tailcalls in Mono

我在F#中有一些代碼,在.net下工作正常,但在Mono下溢出了堆棧。 一個相關的問題是,它似乎已經執行了很長時間,以至於據稱可用的堆棧空間用完了(它以System.Threading.Thread(ts,1000000000)開始)。 據我所知,它死掉的折疊是尾部遞歸的,堆棧跟蹤看起來好像尾部優化沒有完成。 我正在使用--optimize = tailc運行3.2.1。

是否有人確切地知道哪些類型的尾部調用會刪除調用堆棧,而哪些不會呢? 或者,如何分配更多的堆棧? 非常感謝。

我知道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+ ,但根據默認情況下啟用的編譯器選項(F#)而言。

我認為解決這個問題的最佳選擇是:

  • 向Xamarin提交錯誤報告
  • 轉到#monodev IRC頻道(在irc.gnome.org上),查看那里的開發人員/貢獻者之一是否可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM