DU 的点表示法防止嵌套

dot-notation for DUs prevent nesting

有了这两个歧视联盟 (DU):

type Premier = |M1 of int
type Second = |M2 of 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

但不接受以下嵌套的 dot 语法(与 类 语法的重要区别):

let s_3 = Second.M2.M1 42

问题: 造成这种情况的根本原因是什么?我的意思是,是否与 F# 语法/文法的其他部分存在冲突或不一致,从而阻止了它?还是会导致类型推断困难?

跟进:我仍然有两种方法(s_1 和 s_2)来定义我的 Second 类型的变量,但是否有更惯用的方法和 DU 的简洁第三种方式 ?

我不明白为什么这会起作用。这两种工作方式是创建包含另一个值的可区分联合的标准方式。从 F# 的角度来看,您尝试的第三个选项没有意义。再解释一下:

  • M1 42Premier
  • 类型的值
  • M2 是一个采用 Premier 和 returns Second
  • 的构造函数
  • M2 (M1 42) 使用参数调用构造函数 - 所以你得到 Second

有了管道,效果完全一样

  • 42 |> M1int 传递给构造函数 M1 导致 Premier
  • 42 |> M1 |> M2 表示 (42 |> M1) |> M2 - 也就是说,它将 Premier 值传递给 M2 构造函数,您将得到 `Second.

至于您尝试写 Second.M2.M1 42,这是无效的,因为:

  • Second.M2 是一个构造函数(函数),需要 Premier 和 returns Second.
  • 一个函数没有任何成员 - 所以你不能在构造函数上做 .