2016-11-12 5 views
1
module p1= 
    let rec fn n acc = ... 
    let result = fn 999 0 

同じ名前空間で別のモジュールから呼び出されます。 fnはintをintで返します。後者の場合は、(1)...制御が戻って、それがハングアップコンソールに行くしない理由モジュールの結果がコンソールアプリケーションをハングする

これは、いずれの場合に動作します...

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

しかし、ここでは、私が把握することはできません。他の目的のために

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

または

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

、私は常にint型を返すために、P1を持っていることを好むだろう。 p1.resultの理由は、あらかじめ定義された入力を持つためです。

編集1: 私はそれを絞り込んだ。 かかわらずと呼ばれるモジュールの、すべてのモジュールが実行されている。この形式では20個のモジュールの各...

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

があります。したがって、アプリはぶら下がっていませんが、すべてのモジュールを実行するのに非常に時間がかかります。奇妙なことに、返される結果は実行のために実際に選択されたモジュールからのものです。

EDIT 2 ... Vandroiyの解像度...ありがとう:

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

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

私の推測では、p1モジュールのバグです。無限ループなどを作成したかどうかを確認するために数値を返すように結果を変更してみてください –

+4

再生できません。 [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 –

答えて

2

最終的なプログラムを必要としない値が計算されませんことを保証していません。高価な計算の結果をモジュールで公開する通常の方法は、関数と遅延値です。

機能:

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

レイジー:

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

怠惰な計算の結果は、それらに.Force()を呼び出すことによってアクセスされます。彼らは、高価な計算が必要なときに一度だけ実行されることを保証します。参照:Lazy computations in F#

+0

ありがとう! オペレーション編集の変更を表示します。 –

関連する問題