F# 创建由int和float'的子集组成的类型;

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

假设我只想表示这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
            | 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
也就是说,如果你想改用你的type
Temp
,这是很难做到的,因为它基本上需要具备这种能力,而这是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不,我不是