在Visual Studio中使用continuation启动函数时出现问题

时间:2014-12-06 17:14:58

标签: f# continuations

我目前正在尝试使用Petricek和Skeet(2010)的“真实世界功能编程”一书来学习f#,但在使用continuation避免堆栈溢出时遇到了问题。

我遇到的问题是我的代码使用continuation在f#interactive中启动时效果很好,但是当将代码放在program.fs文件中然后通过Visual Studio中的调试器启动时仍会导致堆栈溢出。

我不清楚为什么会发生这种情况,如果有人能解释为什么会发生这种情况,我会非常感激。

如果Visual Studio的版本相关,我使用: Visual Studio Ultimate 2012 版本11.0.61030.00更新4

使用的.Net框架是: 版。 4.5.51641

本书中提出的导致此问题的代码如下所示:

open System
let rand = new Random()

//A tree is either a leaf with a value or a node that contains two children
type IntTree =
    | Leaf of int
    | Node of IntTree * IntTree

//A list of that will decide all leaf values
let numbers2 = List.init 1000000 (fun _ -> rand.Next(-50,51))

///Creates an imbalanced tree with 1000001 leafs.
let imbalancedTree2 =
    numbers2 |> List.fold (fun currentTree num -> 
        Node(Leaf(num), currentTree)) (Leaf(0)) 

//Sums all leafs in a tree by continuation and will execute the inserted function with the total     
//sum as argument once all values have been summed.
let rec sumTreeCont tree cont =
    match tree with
    | Leaf(num) -> cont(num)
    | Node(left, right) -> 
        sumTreeCont left (fun leftSum -> 
            sumTreeCont right (fun rightSum -> 
                cont(leftSum + rightSum)))

//Sums the imbalanced tree using the sumTreeCont function
let sumOfTree = sumTreeCont imbalancedTree2 (fun x -> x)

提前致谢! // Tigerstrom

1 个答案:

答案 0 :(得分:3)

如果在调试模式下运行程序,则默认的Visual Studio项目设置会禁用尾调用。主要原因是,在启用尾调用的情况下,您在调用堆栈中没有获得非常有用的信息(这会使调试更加困难)。

要解决此问题,您可以转到项目选项并在“构建”页面上选中“生成尾调用”。在发布模式下,默认情况下启用此功能。