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 42
是 Premier
类型的值
M2
是一个采用 Premier
和 returns 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
和 returns Second
.
- 一个函数没有任何成员 - 所以你不能在构造函数上做
.
。
有了这两个歧视联盟 (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 42
是Premier
类型的值
M2
是一个采用Premier
和 returnsSecond
的构造函数
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
和 returnsSecond
.- 一个函数没有任何成员 - 所以你不能在构造函数上做
.
。