有没有办法让我完全符合歧视的工会路径?

时间:2016-05-10 03:07:12

标签: f# discriminated-union

有没有办法让我完全符合歧视的工会路径?

我目前有这个:

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

我理解如果有任何歧义,将引用最后声明的歧视联合类型。

但是,有没有办法让我完全符合歧视的工会路径? 因此,我希望减少工会案件中的措辞。

2 个答案:

答案 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。对于具有YesAny等通常不显式值的联合非常有用。