如何将记录元组转换为私有值

Edw*_*rey 4 f# tuples access-control

如何使用模块级let绑定将两个私有值绑定到元组中的记录?

type private T = {F:int}
let private a = {F=1}
let private b, private c = {F=2}, {F=3}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,a工作正常,但对于绑定b和c每个失败的错误:

错误FS0410:类型'T'比值,构件不易接近或类型'val patternInput : T * T'它是在使用

Dan*_*iel 5

要了解为什么这不起作用,请使用Reflector对其进行反编译.你正在创建一个元组并立即对其进行解构.无论如何,在调试模式下,中间元组被创建为internal封闭类型的字段(模式匹配的实现细节).当然,这使得它更容易接近T,这是private.我很想知道这是不是一个bug(好像是这样).

编辑

它变得怪异......

以下代码无法编译(语法错误),但如果类型是公共let的let private,则编译正常,而不是使用.

type private T = {a:int; b:int}
let private t = {a=0; b=0}
let private {a=a; b=b} = t //syntax error

type private U() = class end
let private ul = [U()]
let private [u] = ul //syntax error
Run Code Online (Sandbox Code Playgroud)

我认为可以说模块级私有let绑定中的解构存在一些问题.