2011-08-04 7 views
1

私はちょうどF#を始めていて、15年前のプログラミング言語のクラス(実際には「現代的」なC#)から関数型プログラミングを行っていません。F#noob help lazy and value

私は#はLINQPad 4を使用してスニペットこのFで探しています

let add x y = x + y 

let lazyPlusOne x = lazy add x 1 
let e = lazyPlusOne 15 
Dump e 

let plusOne x = add x 1 
let f = plusOne 15 
Dump f 

それが生成する出力は次のとおりです。

Lazy<Int32> 
    Value is not created. 
    IsValueCreated False 
    Value 16 

16 

私が必要になるまで評価を遅らせるために怠惰なキーワードを理解し、C#のと同じ遅延実行。

「値は作成されていません」とはどういう意味ですか?

+0

「ダンプ」の実装は何ですか? – ildjarn

+0

こんにちはガブリエル、私は個人的に重いLINQPadユーザーで、私自身のライセンスを持っていて、私の同僚に私の同僚のために5をもっと買うようにしてくれました。 –

+0

チップのおかげで - linqpadも好きですが、Fの提案と一緒に行くよ –

答えて

3

キーワードlazyを使用して(lazyPlusOne関数のように)遅延値を構成すると、結果はタイプLazy<int>の値になります。これは、実際に必要な場合にのみ評価されるタイプintの値を表します。

私はDump関数は、すべてのプロパティを含む値を印刷しようと仮定 - それは印刷を開始するとき、値が評価されていないので、ToString方法プリントValue is not created.それを反復する他の特性上、それはValue、遅延値にアクセスする場合(その値が今必要であるため)評価されます。評価後、プロパティは16を返し、それが印刷されます。

あなたはF#のやさしい印刷機能をDumpを置き換えることができます(あるいは単に通常のIntelliSense、ETECをチェック背景エラーでVisual Studioの内部のF#と遊ぶのが非常に便利な方法であるF#インタラクティブを使用しています。)

のF# printfn "%A"のような親しみやすい印刷機能は、Valueプロパティにアクセスしないので、誤って値を評価することはありません。ここでF#インタラクティブからの抜粋です: 'Eダンプ'、 'lazyPlusOne 15' のよう

> let a = lazy (1 + 2);; 
val a : Lazy<int> = Value is not created. // Creates lazy value that's not evaluated 

> a;; 
val it : Lazy<int> = Value is not created. // Still not evaluated! 

> a.Value;; // Now, the lazy value needs to be evaluated (to get the Value) 
val it : int = 3 

> a;;  // After evaluation, the value stays cached 
val it : Lazy<int> = 3 
+0

ありがとうございます - 私はあなたの応答のために "直感"の悪い道を歩いているかもしれません –

0

が評価されていません。 'let e = lazyPlusOne 15'は 'lazyPlusOne 15'の評価を必要としません。 eがまだ評価しているものをまだ知る必要はありません。 ダンプが評価をトリガしており、評価後に値をダンプするだけで意味が異なります。