受保护/公共变量与F#中的闭包

时间:2012-02-29 14:51:58

标签: 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

澄清非常好。

1 个答案:

答案 0 :(得分:2)

不,你实际展示的是F#中的值范围。

在第一种方法中,字典在模块级别声明;因此,模块中的任何功能都可以访问/修改它。如果你在psi函数中删除第二个参数,那么这一点就更清楚了。每次调用psi后,字典仍然可用,psi是真正的memoize组合器。

第二种方法在函数内部具有字典声明,并且该字典的范围仅是函数。每次拨打mem时,它都会创建一个新的字典,因此您不会记​​住任何内容。

就访问修饰符而言,您的示例更接近public/private值。这些关键字为available in F#protected修饰符与继承相关,您在F#中遇到的次数会少得多。这是另一个故事。