「Objective-CAMLによるアプリケーションの開発」の107ページの例に従っています。ocamlの遅延評価
type 'a v = Imm of 'a| Def of (unit -> 'a)
は、今私は、コンストラクタタイプDef
は、遅延評価を強制する方法を理解しようとしていますか? fを(unit -> 'a)
とパラメータ化することは、どういう意味ですか?
「Objective-CAMLによるアプリケーションの開発」の107ページの例に従っています。ocamlの遅延評価
type 'a v = Imm of 'a| Def of (unit -> 'a)
は、今私は、コンストラクタタイプDef
は、遅延評価を強制する方法を理解しようとしていますか? fを(unit -> 'a)
とパラメータ化することは、どういう意味ですか?
タイプ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
の計算は、含まれている関数を呼び出すまで延期されます。
本当にありがとうございます。これは私の質問に答える。 –
フォローアップの質問。 どのようにしてDef型の値を作成しますか? –
(私は自分の答えに更新を加えました) –