F# F中的受保护/公共变量与闭包#
以下代码是否模拟了F#中受保护变量和公共变量之间的差异?还是我遗漏了什么F# F中的受保护/公共变量与闭包#,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 -&g
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
let(=?)(d:Dictionary)(x:a)=d.TryGetValue(x)
让psi(f:'a->'b)(d:Dictionary)=//公共字典
设lambda(x:'a)=
将(d=?x)与
|是的,我->我
|false,->d.Add(x,f x)
f x
兰姆达
让mem(f:'a->'b)=//受保护的字典
设d=新字典()
让orize(输入:'a)=
将(d=?输入)与
|是的,我->我
|false,->d.Add(输入,f输入)
f输入
奥利泽
澄清会很好。不,您实际演示的是F#中的值的范围 在第一种方法中,字典是在模块级别声明的;因此,模块中的任何功能都可以访问/修改它。如果在
psi
函数中删除第二个参数,问题就更清楚了。每次调用psi
后,字典仍然可用,psi
是一个真正的记忆组合器
第二种方法在函数中有字典声明,并且该字典的作用域仅为函数。每次你调用mem
,它都会创建一个新的字典,这样你就不会真正记住任何东西
就访问修饰符而言,您的示例更接近于
public/private
值。这些关键字是。protected
修饰符与继承相关,您在F#中很少会遇到继承。这是另一个故事。但这与受保护变量与公共变量不完全相同吗?这些是修饰范围的形容词。而且,根据理论,我必须能够用F模拟所有C#和F#,反之亦然……因此,如果这不能说明公共和受保护之间的区别,那么“module”本质上是“let”的另一个词吗?除了这一次,“module”级别的每个元素都是公共的而不是私有的?就访问修饰符而言,您的示例更接近于public/private
值。这些关键字是。protected
关键字与继承有关,这是另一回事。啊。。。好啊现在我知道了我不知道的:)如果我用一个受保护的东西定义一个类,然后用另一个东西继承它,我不会继承受保护的东西……或者类似的东西。每次我想从.Net framework访问受保护的属性时,我都试图避免与C#进行互操作。但我想这只是一个面向对象的东西。谢谢,垫