F# 创建由int和float'的子集组成的类型;
假设我只想表示这8种温度:F# 创建由int和float'的子集组成的类型;,f#,F#,假设我只想表示这8种温度: 98F 99F 100F 101F 37.0C 37.5C 38.0C 38.5C 我会有这样一种类型: type Temp = | F of int | C of float 也许我不会使用int和float,而是使用更具体的类型 如何创建只允许8种不同温度的类型?如果您非常自信只需要8种温度,您可以这样做: type AllowedTemperatures = | F98 | F99
98F
99F
100F
101F
37.0C
37.5C
38.0C
38.5C
我会有这样一种类型:
type Temp =
| F of int
| C of float
也许我不会使用int
和float
,而是使用更具体的类型
如何创建只允许8种不同温度的类型?如果您非常自信只需要8种温度,您可以这样做:
type AllowedTemperatures =
| F98
| F99
| F100
| F101
| C370
| C375
| C380
| C385
type Temp =
| F of int
| C of float with
static member fromInt value =
if value <> 98 && value <> 99 && value <> 100 && value <> 101 then
raise <| System.ArgumentOutOfRangeException ("value")
else
F value
static member fromFloat value =
if value <> 37.0 && value <> 37.5 && value <> 38.0 && value <> 38.5 then
raise <| System.ArgumentOutOfRangeException ("value")
else
C value
也就是说,如果你想改用你的typeTemp
,这是很难做到的,因为它基本上需要具备这种能力,而这是F#没有的特性(尽管显然有一种我没有尝试过的方法试图将其添加到语言中)。您可以尝试以下方法:
type AllowedTemperatures =
| F98
| F99
| F100
| F101
| C370
| C375
| C380
| C385
type Temp =
| F of int
| C of float with
static member fromInt value =
if value <> 98 && value <> 99 && value <> 100 && value <> 101 then
raise <| System.ArgumentOutOfRangeException ("value")
else
F value
static member fromFloat value =
if value <> 37.0 && value <> 37.5 && value <> 38.0 && value <> 38.5 then
raise <| System.ArgumentOutOfRangeException ("value")
else
C value
然而,有人仍然可以调用
Temp.F
哎哟。这看起来真的很糟糕。我相信fromInt
和fromFloat
方法中的|
应该都是&
,否则无论值是多少,条件都是真的(并且会引发异常)。毕竟,如果值为98,则不是99,依此类推。此外,如果定义了let F=if…
和let C=if…
,则在创建values@AMieres你能给我看看吗?我想我understand@l--我想他是在说给F
构造函数阴影。但是,有人仍然可以直接调用Temp.F
。您是否使用这些值执行计算?@phoog不,我不是