有什么方法可以完全限定有区别的并集路径吗
我现在有这个:
type PostionOfScott =
| ScottOnFirst
| ScottOnSecond
| ScottOnThird
type PostionOfBrian =
| BrianOnFirst
| BrianOnSecond
| BrianOnThird
type PostionOfCherice =
| ChericeOnFirst
| ChericeOnSecond
| ChericeOnThird
我想这样做:
type PostionOfScott =
| First
| Second
| Third
type PostionOfBrian =
| First
| Second
| Third
type PostionOfCherice =
| First
| Second
| Third
然而,当我提供以下代码时:
(*Functions*)
let hit play batterUp =
match batterUp with
| ScottAtBat -> match play with
| Single -> Scott First
| Double -> Scott Second
| Tripple -> Scott Third
我收到以下错误:
错误此表达式应具有类型PostionOfScott但这里有类型Cherice 的发布
我知道,如果有任何歧义,最后声明的受歧视的并集类型将被引用。
然而,有什么办法让我完全符合受歧视的工会道路吗?因此,我想减少工会案例中的措辞。
我认为重复每个玩家的位置类型定义可能不是最好的设计选择。把这些事情分开会更有意义,然后你的问题就会自然而然地消失。
type Position =
| First
| Second
| Third
type Player =
| Scott
| Brian
| Cherice
type PlayerPosition = {Player : Player; Position : Position}
然后你可以进行模式匹配:
let hit play batterUp =
match batterUp with
|{Player = Scott; Position = First} -> ...
听起来像是在寻找RequireQualifiedAccess属性。
[<RequireQualifiedAccess>]
type PositionOfScott =
| First
| Second
| Third
这样,您就需要在PositionOfScott
成员之外使用PositionOfScott.First
而不是First
。对于具有Yes
或Any
等一般不带特征值的并集非常有用。