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

以下代码是否模拟了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
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#进行互操作。但我想这只是一个面向对象的东西。谢谢,垫