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

  • 本文关键字:闭包 变量 受保护 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

澄清一下就好了。

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

在第一种方法中,字典是在模块级别声明的;因此,模块中的任何函数都可以访问/修改它。如果在psi函数中去掉第二个参数,这一点就更清楚了。每次调用psi之后,字典仍然可用,并且psi是一个真正的记忆组合子。

第二种方法在函数内部有dictionary声明,并且该dictionary的作用域仅为函数。每次调用mem时,它都会创建一个新的字典,这样你就不会真正记住任何东西。

在访问修饰符方面,您的示例更接近public/private值。这些关键字在F#中可用。protected修饰符与继承有关,而在F#中您很少遇到继承。这是另一个故事。

最新更新