X

问题描述 投票:0回答:1

我有一个带有选择的判别联合体,它的类型是另一个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而不是我使用的 cMappingsOfC c 虽然Rider ide强调 c 并提供了一个不同的错误。

f#
1个回答
3
投票

C as c,这样就可以了。C c

let StringMappings c = match c with
    | A -> ["a";"A"]
    | B -> []
    | C -> (MappingsOfC c)

其实左边的部分 c (之前 asc 关键字,如果提供的话)在匹配分支中是一个 as模式

. 而且pattern必须是有效的--这取决于紧接在后面提供的值的类型。C 关键字。| A as a ->这里编译器会明白你要匹配的是一个 | B as b -> 值,因为它看到了模式 | C _ as c

(这些都是有效的)。

2
投票

是一个无效的模式 ->. 这里的有效模式一定是。as如果你不关心... when (不需要使用它),但是,你必须提供一个通配符。 以使模式有效。但在你的例子中,我很确定你很在意 所以代码应该是这样的。match

Dunion

© www.soinside.com 2019 - 2024. All rights reserved.