使用这两个被歧视的联盟(DUs):
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)来定义我的第二种类型的变量,但对于DU来说,是否有更为惯用和简洁的第三种方式?
答案 0 :(得分:4)
我不明白为什么这应该有效。这两种工作方式是创建包含另一个值的区别联合的标准方法。从F#角度来看,你尝试的第三个选项没有意义。再解释一下:
M1 42
是Premier
M2
是一个构造函数,它接受Premier
并返回Second
M2 (M1 42)
使用参数调用构造函数 - 因此您获得Second
使用滚边,东西完全相同
42 |> M1
将int
传递给构造函数M1
,从而产生Premier
值42 |> M1 |> M2
表示(42 |> M1) |> M2
- 也就是说,它将Premier
值传递给M2
构造函数,然后您获得`Second。至于您尝试撰写Second.M2.M1 42
,这是无效的,因为:
Second.M2
是一个构造函数(函数),需要Premier
并返回Second
。.
。