以下代码是否模拟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
澄清非常好。
答案 0 :(得分:2)
不,你实际展示的是F#中的值范围。
在第一种方法中,字典在模块级别声明;因此,模块中的任何功能都可以访问/修改它。如果你在psi
函数中删除第二个参数,那么这一点就更清楚了。每次调用psi
后,字典仍然可用,psi
是真正的memoize组合器。
第二种方法在函数内部具有字典声明,并且该字典的范围仅是函数。每次拨打mem
时,它都会创建一个新的字典,因此您不会记住任何内容。
就访问修饰符而言,您的示例更接近public/private
值。这些关键字为available in F#。 protected
修饰符与继承相关,您在F#中遇到的次数会少得多。这是另一个故事。