создание типа, состоящего из подмножества int и float ' - PullRequest
0 голосов
/ 16 января 2019

Предположим, я хотел изобразить ТОЛЬКО эти 8 температур:

98F
99F
100F
101F
37.0C
37.5C
38.0C
38.5C

У меня будет такой тип:

type Temp = 
  | F of int
  | C of float

Возможно, вместо использования int и float, я бы использовал более конкретные типы?

Как создать тип, который ТОЛЬКО допускает 8 различных температур?

1 Ответ

0 голосов
/ 16 января 2019

Что ж, если вы абсолютно уверены, что вам потребуется всего лишь 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...