2012-02-29 56 views
2

以下代碼是否模擬F#中的受保護變量和公共變量之間的區別?或者我錯過了什麼?受保護/公共變量與Vs. 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#中的值範圍。

在第一種方法中,字典是在模塊級聲明的;因此,模塊中的任何功能都可以訪問/修改它。如果您在psi函數中刪除第二個參數,則這一點更加清晰。在每次調用psi後,字典仍然可用,並且psi是真正的memoize組合器。

第二種方法是在函數內部有字典聲明,而這個字典的範圍只是函數。每次你打電話給mem,它都會創建一個新的字典,所以你不會記住任何東西。

在訪問修飾符方面,您的示例更接近public/private值。這些關鍵字是available in F#protected修飾符與繼承有關,您將在F#中經常遇到這種繼承。這是另一個故事要講的。

+0

但這不是保護與公共變量完全相同的東西嗎? 這些是修改範圍的形容詞。而且,根據理論,我必須能夠用F#模擬所有C#,反之亦然......所以如果這不能說明公共和受保護之間的區別,那麼會發生什麼呢? – cdonlan 2012-02-29 15:12:20

+0

是「模塊」本質上是「讓」的另一個詞,除了這一次,「模塊」級別的每個元素是公開的而不是私人的? – cdonlan 2012-02-29 15:16:14

+1

在訪問修飾符方面,您的示例更接近'public/private'值。這些關鍵字[在F#中可用](http://msdn.microsoft.com/zh-cn/library/dd233188.aspx)。受保護的關鍵字與繼承有關,這是另一回事。 – pad 2012-02-29 15:18:28