以下代码是否模拟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#中您很少遇到继承。这是另一个故事。