3

ここでの副次的な質問として、F# でデリゲート マルチキャストのようなことを行う最も簡単な方法は何ですか?適切なタイトルで完全な質問を提起する方がよいと思います。

このバージョンでは再帰は発生しません: (ここでnotifyは不変のようですd)

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x
let d = (notify >> (wrap a)) // point free
notify <- d

notify "ss"

このバージョンはそうでしょう。(ここでnotifyは可変のようですd

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x  
let d x =
    (notify >> (wrap a)) x // normal function
notify <- d

notify "ss" // endless loop

別の失敗バージョン:

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x  
let d =
    fun x -> (notify >> (wrap a)) x // Here
notify <- d

notify "ss" // endless loop

この行動の不一致がある理由に関するガイドラインやその他のリソースはどこにありますか? それは特定のコンパイラ/言語に結び付けられていますか、それともすべての関数型言語に適用される理論がありますか?

4

1 に答える 1

3

制御されていない可変性がこの動作の理由です。Haskell のような他の言語は、この種の問題を回避するソフトウェア トランザクション メモリ技術を使用して制御された可変性を提供します。また、熱心な評価はここで重要な役割を果たします。

let d = (notify >> (wrap a)): この場合、notifyhas の値が合成され(wrap a)、結果が割り当てられますd

let d x = (notify >> (wrap a)) x: ここでは、実際に関数を呼び出すまで関数の本体は実行されないため、変更されdた値を取得しますnotify

于 2013-07-19T12:35:59.877 に答える