我有一个带有选择的判别联合体,它的类型是另一个du,如下所示。
type DunionSubset =
| X
| Y
type Dunion =
| A
| B
| C of DunionSubset
我想产生一个映射到一个字符串列表,用于 Dunion
类型,自然延伸到 C
因此 DunionSubset
当我错误地使用as给构造函数分配一个别名时,如下所示。
let MappingsOfC = function
| X -> ["x"]
| Y -> ["y"]
let StringMappings = function
| A -> ["a";"A"]
| B -> []
| C as c -> (MappingsOfC c)
编译器给我的答案是:
[FS0019] This constructor is applied to 0 argument(s) but expects 1
我对as的错误使用到底是如何导致这个编译器错误的?有趣的是,编译器错误的位置是在 C
而不是我使用的 c
在 MappingsOfC c
虽然Rider ide强调 c
并提供了一个不同的错误。
C as c
,这样就可以了。C
c
let StringMappings c = match c with
| A -> ["a";"A"]
| B -> []
| C -> (MappingsOfC c)
其实左边的部分 c
(之前 as
和 c
关键字,如果提供的话)在匹配分支中是一个 as
模式
. 而且pattern必须是有效的--这取决于紧接在后面提供的值的类型。C
关键字。| A as a ->
这里编译器会明白你要匹配的是一个 | B as b ->
值,因为它看到了模式 | C _ as c
和
是一个无效的模式 ->
. 这里的有效模式一定是。as
如果你不关心... when
(不需要使用它),但是,你必须提供一个通配符。 以使模式有效。但在你的例子中,我很确定你很在意 所以代码应该是这样的。match
Dunion