有没有什么办法让我完全符合受歧视的工会道路



有什么方法可以完全限定有区别的并集路径吗

我现在有这个:

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。对于具有YesAny等一般不带特征值的并集非常有用。

最新更新