我試圖建立在樹結構中的一些規則,用邏輯門即和,不,或,以及條件,例如物業x等於值y。我首先寫了最明顯的遞歸函數,它的工作。然後我試着編寫一個不會導致延續傳遞樣式的堆棧溢出的版本,從this post about generic tree folding和this answer on stackoverflow中提取我的提示。F#樹構建函數導致堆棧溢出在Xamarin工作室
它適用於小型樹木(深度大約爲1000),但不幸的是,當使用大樹時,當我在Xamarin Studio的Mac上運行它時,會導致一個堆棧溢出。任何人都可以告訴我,我是否誤解了F#如何處理尾遞歸代碼或者該代碼是否不是尾遞歸?
let FoldTree andF orF notF leafV t data =
let rec Loop t cont =
match t with
| AndGate (left, right)->
Loop left (fun lacc ->
Loop right (fun racc ->
cont (andF lacc racc)))
| OrGate (left, right)->
Loop left (fun lacc ->
Loop right (fun racc ->
cont (orF lacc racc)))
| NotGate exp ->
Loop exp (fun acc -> cont (notF acc))
| EqualsExpression(property,value) -> cont (leafV (property,value))
Loop t id
let evaluateContinuationPassingStyle tree data =
FoldTree (&&) (||) (not) (fun (prop,value) -> data |> Map.find prop |> ((=) value)) tree data
這是令人失望的。花了很長一段時間認爲這是我的執行問題。發現這個[bug報告](https://bugzilla.xamarin.com/show_bug.cgi?id=12635#c11),看起來像它匹配,最後的評論看起來像它不會很快解決。 – NickL
單聲道正在消失。切換到.NET Core。 –
@FyodorSoikin我不認爲Mono很快就會離開Xamarin。 – svick