使用F#中的整数值区分联盟

时间:2015-04-16 18:23:07

标签: f# f#-3.0

我试图编写一个具有以下签名的F#类型:

type Foo = (Distance * Event * Course)

这样你就可以像这样创建一个Foo:

let bar = (25, Freestyle, LCM)

现在第二部分(事件和课程)很容易 - 我确定距离也是,我只是不知道它 - 我只是使用一个受歧视的联盟。

让我们说距离的唯一有效值是[25; 50; 100],构建距离类型的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

我假设目标是轻松访问实际的整数值,但仅将其限制为一定数量的案例。

@Petr的建议可以正常工作,你只需将枚举值转换为int。

另一种选择是计算DU类型的方法中的值:

type Distance = 
    TwentyFive | Fifty | Hundred
    member this.ToInt() =
        match this with
        | TwentyFive -> 25
        | Fifty -> 50
        | Hundred -> 100

或者如果你想要更强大的语法支持,单例活动模式可能会很好:

type Event = Freestyle | Backstroke
type Distance = TwentyFive | Fifty | Hundred
let (|IntDistance|) d =
    match d with
    | TwentyFive -> 25
    | Fifty -> 50
    | Hundred -> 100

let race = (Fifty, Freestyle)

let (IntDistance(dist), evt) = race
printfn "Race info: %d %A" dist evt

match race with
| IntDistance(dist), Freestyle -> ...
| IntDistance(dist), Backstroke -> ...

答案 1 :(得分:1)

您可以使用.NET枚举:

type Distance = TwentyFive=25 | Fifty=50 | Hundred=100

对于模式匹配,您必须使用限定名称:Distance.Fifty