Что ж, если вы абсолютно уверены, что вам потребуется всего лишь 8 температур, вы можете сделать что-то вроде этого:
type AllowedTemperatures =
| F98
| F99
| F100
| F101
| C370
| C375
| C380
| C385
Тем не менее, если вы хотите вместо этого использовать свой тип Temp
, это не может быть легко сделано, так как в основном требуется способность иметь зависимых типов , чего нет у F # (хотя очевидно, есть пакет , который я не пробовал, который пытается добавить это к языку). Вы можете попробовать что-то вроде этого:
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
И всегда создавайте своих разборчивых членов союза через статические члены. Но это не помешает кому-то напрямую вызвать конструктор.
РЕДАКТИРОВАТЬ: Благодаря предложениям AMieres, один из способов уменьшить вероятность неправильного вызова F - это затенять конструкторы в Temp
. Например, вы можете сделать что-то вроде:
type Temp =
| F of int
| C of float
let F value =
if value <> 98 && value <> 99 && value <> 100 && value <> 101 then
raise <| System.ArgumentOutOfRangeException ("value")
else
F value
Однако кто-то еще может позвонить Temp.F
.