有没有办法让我完全符合歧视的工会路径?
我目前有这个:
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但这里有类型 PostionOfCherice
我理解如果有任何歧义,将引用最后声明的歧视联合类型。
但是,有没有办法让我完全符合歧视的工会路径? 因此,我希望减少工会案件中的措辞。
答案 0 :(得分:9)
我认为重复每个玩家的位置类型定义可能不是最好的设计选择。将这些东西分开然后你的问题自然消失会更有意义。
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} -> ...
答案 1 :(得分:5)
听起来你正在寻找RequireQualifiedAccess属性。
[<RequireQualifiedAccess>]
type PositionOfScott =
| First
| Second
| Third
有了这个,您需要在PositionOfScott.First
成员之外使用First
代替PositionOfScott
。对于具有Yes
或Any
等通常不显式值的联合非常有用。