2017-09-19 14 views
3

「Objective-CAMLによるアプリケーションの開発」の107ページの例に従っています。ocamlの遅延評価

type 'a v = Imm of 'a| Def of (unit -> 'a) 

は、今私は、コンストラクタタイプDefは、遅延評価を強制する方法を理解しようとしていますか? fを(unit -> 'a)とパラメータ化することは、どういう意味ですか?

答えて

4

タイプunit -> 'aは、関数を表します。したがって、関数を呼び出すまで、計算は行われません。つまり、延期されます。

unitは、この関数を呼び出すと()(実際には型の値がunitの値)を渡すことを意味します。

'aこの関数は、型コンストラクタvのパラメータで指定された型の値を返します。したがって、int vは、intを返す遅延計算のタイプです。等々。 Defがタイプではないことを

let deferred_float = Def (fun() -> sin 1.0) 

注:

更新ここ

はタイプfloat vの値です。これは、単なる値のコンストラクタです(Someなど)。 Defをタイプunit -> 'aの値をとる関数と考えると便利なことがよくありますが、タイプ'a vの値を返します。あるいは、それを機能を保持する小さなタグ付きデータ構造と考えることができます。いずれの場合も、値であり型ではありません。ここで

は、それがトップレベルでどのように見えるかです:

# let deferred_float = Def (fun() -> sin 1.0);; 
val deferred_float : float v = Def <fun> 

あなたはそれがsin 1.0を計算するのに長い時間(例えば分)を取ることを想像した場合、ポイントは値deferred_floatが多かれ少なかれ瞬時に構築されていることです。 sin 1.0の計算は、含まれている関数を呼び出すまで延期されます。

+0

本当にありがとうございます。これは私の質問に答える。 –

+0

フォローアップの質問。 どのようにしてDef型の値を作成しますか? –

+0

(私は自分の答えに更新を加えました) –