3

私は、不変値を使用したプログラミングの Clojure / 関数型アプローチの大ファンです。

ただし、遅延を不変の値と見なす必要があるかどうかはわかりません (純粋な関数を遅延させると仮定して)。私が特に興味を持っているのは、より大きな不変データ構造に 1 つ以上の遅延がある場合です。

たとえば、遅延を含むベクトル:

[1 2 (delay (reduce + (range 1000)))]

私が見る限り、これは、評価を強制するまで遅延の結果を見ることができないという意味で、不変の値であるかのように動作します。その後、結果はキャッシュされ、その後は値が変更されることはありません。

このように遅延を不変値として扱うことに問題はありますか?

4

2 に答える 2

3

遅延は、通常サンクと呼ばれるものをモデル化します。これは、まだ評価されていない式への参照であり、強制されるとその結果に置き換えられ、その後は不変になります。Haskellは、このような内部的に変更可能なサンクを使用して、厳密でない評価をモデル化します。この式[1, 2, foldl1 (+) [0..1000]]は、厳密な評価が行われている言語で明示的に遅延された同等の表現と名目上同じです。

もちろん、delayオブジェクトで使用される関数が純粋であれば、それを不変として扱うことに害はありません。これはいくつかの方法で考えることができます。

  • 純粋関数は、定義上、その結果に置き換えることができます。

  • (この場合、遅延オブジェクトの)ローカルミューテーションは関数を不純にしません。

もちろん、Clojureは純粋な関数と不純な関数を区別しないので、開発者としてそれについて熱心に取り組むのはあなた次第です。

于 2012-05-29T02:34:34.653 に答える
1

delay関数が値プロデューサーであるのと同じ「値プロデューサー」でありdelay、「値プロデューサーコード」が遅延して実行されるようにします。つまり、値を要求されたときに、不変性は生成される値の属性です。したがって、生成された値は、関数呼び出しの場合と同じように不変であると見なすのは問題ありません。これは生成された値に関するものですが、関数が副作用を実行している場合、他の問題が発生する可能性がありますが、生成された値は不変です。

于 2012-05-29T04:13:53.840 に答える