F# DU的点表示法防止嵌套
对于这两个受歧视的工会(DU): 我可以使用以下有效代码行:F# DU的点表示法防止嵌套,f#,F#,对于这两个受歧视的工会(DU): 我可以使用以下有效代码行: let p_1 = M1 42 let p_2 = 42 |> M1 let p_3 = Premier.M1 42 let s_1 = M2 (M1 42) let s_2 = 42 |> M1 |> M2 但不接受以下嵌套的点语法(与类语法的重要区别): 问题:其根本原因是什么?我的意思是,与F#语法/语法的其他部分是否存在冲突或不一致,从而阻止了它?还是会导致类型推断困难 跟进:我仍然有两种方法(s_1和
let p_1 = M1 42
let p_2 = 42 |> M1
let p_3 = Premier.M1 42
let s_1 = M2 (M1 42)
let s_2 = 42 |> M1 |> M2
但不接受以下嵌套的点语法(与类语法的重要区别):
问题:其根本原因是什么?我的意思是,与F#语法/语法的其他部分是否存在冲突或不一致,从而阻止了它?还是会导致类型推断困难
跟进:我仍然有两种方法(s_1和s_2)来定义我的第二类变量,但是否有一种更为惯用和简洁的第三种方法来定义DU?我不明白为什么这会起作用。这两种方法都是创建包含另一个值的有差别的联合的标准方法。从F#的角度来看,你尝试的第三种选择没有意义。再解释一下:
是类型为m142
Premier
是一个构造函数,它接受M2
并返回Premier
Second
用一个参数调用构造函数,因此得到M2(m142)
Second
将42 |>M1
传递给构造函数int
,产生M1
值Premier
的意思是42 |>M1 |>M2
——也就是说,它将(42 |>M1)|>M2
值传递给Premier
构造函数,然后得到`秒M2
Second.M2.M1 42
,这是无效的,因为:
是一个构造函数(函数),它期望Second.M2
并返回Premier
Second
- 函数没有任何成员-因此您不能对构造函数执行
是类型为m142
Premier
是一个构造函数,它接受M2
并返回Premier
Second
用一个参数调用构造函数,因此得到M2(m142)
Second
将42 |>M1
传递给构造函数int
,产生M1
值Premier
的意思是42 |>M1 |>M2
——也就是说,它将(42 |>M1)|>M2
值传递给Premier
构造函数,然后得到`秒M2
Second.M2.M1 42
,这是无效的,因为:
是一个构造函数(函数),它期望Second.M2
并返回Premier
Second
- 函数没有任何成员-因此您不能对构造函数执行
静态成员
是最好的方法。问题是,如果您有M3的Premier*Premier
,则此功能不起作用,例如…谢谢。对于“Second.M2.m142”,我可以想象Second.M2(作为期望Premier的构造函数)理解我为这个Premier提供了syntaxic sugar“.m142”作为“Second.M2.m142”的结尾部分。当然,它需要函数后面的点接受后续构造函数,这些构造函数不是其成员列表的一部分,而是它引用的子类型的成员的一部分。这当然是个问题。它是?至少,它要求类型推断构建这样一个列表,并检查候选列表是否有效。(再次感谢您的明确解释)。新手在F#type Second=|M2 of Premier\n\t静态成员FM1(x:int):Second=M2(M1 x)\n然后我可以定义:让s#u 3=Second.FM1 42如果我真的想要嵌套du的点表示法。虽然有点复杂。。。我当然接受你的回答。@FZed-Hmm,我明白你想做什么。使用静态成员
是最好的方法。问题是,如果您有M3的Premier*Premier
,则此功能不起作用,例如。。。
let p_1 = M1 42
let p_2 = 42 |> M1
let p_3 = Premier.M1 42
let s_1 = M2 (M1 42)
let s_2 = 42 |> M1 |> M2
let s_3 = Second.M2.M1 42