DU的点符号可防止嵌套

时间:2015-02-11 20:54:56

标签: f#

使用这两个被歧视的联盟(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来说,是否有更为惯用和简洁的第三种方式?

1 个答案:

答案 0 :(得分:4)

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

  • M1 42Premier
  • 类型的值
  • M2是一个构造函数,它接受Premier并返回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并返回Second
  • 一个函数没有任何成员 - 所以你在构造函数上做.