F# 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和

对于这两个受歧视的工会(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和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
  • 函数没有任何成员-因此您不能对构造函数执行

我不明白为什么这会起作用。这两种方法都是创建包含另一个值的有差别的联合的标准方法。从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
  • 函数没有任何成员-因此您不能对构造函数执行

谢谢。对于“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
,则此功能不起作用,例如…谢谢。对于“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