我试图编写一个具有以下签名的F#类型:
type Foo = (Distance * Event * Course)
这样你就可以像这样创建一个Foo:
let bar = (25, Freestyle, LCM)
现在第二部分(事件和课程)很容易 - 我确定距离也是,我只是不知道它 - 我只是使用一个受歧视的联盟。
让我们说距离的唯一有效值是[25; 50; 100],构建距离类型的最佳方法是什么?
答案 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