2012-02-29 9 views
2

次のコードは、F#の保護変数と公開変数の違いをシミュレートしていますか?または私は何かを逃していますか?プロテクト/パブリック変数F#のクロージャー

let (=?) (d:Dictionary<'a,'b>) (x:'a) = d.TryGetValue(x) 

let psi (f:'a -> 'b) (d:Dictionary<'a,'b>) = // public dictionary 
    let lambda (x:'a) = 
     match (d =? x) with 
     | true, i -> i 
     | false, _ -> d.Add(x,f x) 
         f x 
    lambda 

let mem (f:'a -> 'b) = // protected dictionary 
    let d = new Dictionary<'a,'b>() 
    let orize (input:'a) = 
     match (d =? input) with 
     | true, i -> i 
     | false, _ -> d.Add(input,f input) 
         f input 
    orize 

明確化が優れています。

答えて

2

いいえ、実際に実証するものは、F#の値の範囲です。

第1のアプローチでは、辞書はモジュールレベルで宣言されています。したがって、モジュール内のすべての機能がそのモジュールにアクセス/変更できます。その第2引数をpsi関数にドロップすると、その点はより明確になります。 psiが呼び出されるたびに、辞書は依然として利用可能であり、psiは真のメモアイコンバイナである。

第2のアプローチでは、関数内に辞書宣言があり、この辞書のスコープは関数のみです。 memに電話するたびに、新鮮な辞書が作成されるので、何かを本当に覚えているわけではありません。

アクセス修飾子の点では、例はpublic/privateに近い値になります。これらのキーワードはavailable in F#です。 protected修飾子はF#であまり頻繁に遭遇しない継承に関連しています。それは別の話です。

+0

しかし、保護された変数と公開された変数とはまったく同じものではありませんか? これらはスコープを変更する形容詞です。そして、理論によれば、私はF#ですべてのC#をシミュレートすることができなければならないし、逆もまた同様である。 – cdonlan

+0

は "module"の本質的に別の単語ですが、今回は「モジュール」レベルのすべての要素がプライベートではなく公開されていますか? – cdonlan

+1

アクセス修飾子の点では、あなたの例は 'public/private'値に近いです。これらのキーワードは、[F#で利用可能]です(http://msdn.microsoft.com/en-us/library/dd233188.aspx)。 'protected'キーワードは継承に関連しており、それは別の話です。 – pad

関連する問題