模块结果挂起控制台应用程序

时间:2016-11-12 09:38:09

标签: f#

module p1=
    let rec fn n acc = ...
    let result =  fn 999 0

从同一名称空间下的其他模块调用它。 fn返回acc,即int。

这适用于任何一种情况......

let fnMatchProblem = function
    | 0 -> "Good bye."
    | 1 -> (p1.fn 999 0).ToString() 

但是在这里,我无法弄清楚为什么后一种情况(1)没有......控制权会回到它挂起的控制台。

let fnMatchProblem = function
    | 0 -> "Good bye."
    | 1 -> p1.result.ToString() 

let fnMatchProblem = function
    | 0 -> "Good bye."
    | 1 -> (p1.result).ToString() 

出于其他目的,我宁愿让p1始终返回一个int。 p1.result的原因是具有预定义的输入。

编辑1: 我把它缩小了。 这种格式有20个模块......

module p<n>=
    let function param = ...
    let result = function param

无论调用哪个模块,都会执行所有模块。因此,应用程序没有挂起,但需要很长时间才能执行所有模块。但奇怪的是,返回的结果来自实际选择执行的模块。

编辑2 ......决议......感谢Vandroiy:

let fnMatchProblem = function
    | 0 -> "Good bye."
    | 1 -> p1.result()

module p1=
    let rec fn n acc = ...
    let result () =  fn 999 0 |> string

1 个答案:

答案 0 :(得分:2)

无法保证最终节目不需要计算的值。在模块中公开昂贵计算结果的常规方法是函数和惰性值。

功能:

module p =
    // ...
    let calculateResult () = fn 999 0

懒:

module myModule =
    // ...
    let result = lazy (fn 999 0)

通过在它们上面调用.Force()来访问延迟计算的结果。它们确保昂贵的计算仅运行一次且仅在需要时运行。另见:Lazy computations in F#