В F # возможно ли ограничить диапазон значений в единственном случае с дискриминацией? - PullRequest
0 голосов
/ 27 сентября 2018

В приведенном ниже примере я хочу, чтобы все uint64 были разрешены, кроме нуля.

type Foo =
    | Foo of uint64

let foo = Foo(5UL) // OK
let bar = Foo(-1)  // Compiler error
let bad = Foo(0UL) // I want this to be a compiler error

1 Ответ

0 голосов
/ 27 сентября 2018

Насколько мне известно, вы не можете напрямую устанавливать границы для значений (если кто-то другой знает иначе, пожалуйста, сообщите нам об этом).Я думаю , что называется "зависимыми типами", которые я не верю, что F # поддерживает, по крайней мере, в настоящее время.

Я предполагаю, что вы уже хорошо знаетениже, но для того, чтобы кто-нибудь еще взглянул, я расскажу, как вы могли бы справиться с этим во время выполнения: я полагаю, что самый простой способ сделать это, по сути, состоит в том, чтобы сделать тип закрытым и предоставить только функцию getFoo, которая выполняетПользовательская проверка в то время.В зависимости от того, что вы хотите, вы можете либо обернуть его в опцию, либо выдать исключение, если передан неправильный номер. Например:

type private FooWithException = 
    | Foo of uint64

let getFooWithException (x: uint64) = 
    if x = 0 then
        failwith "x was zero"
    else
        Foo x

или

type private FooOption = 
    | Foo of uint64 option

let tryGetFoo (x: uint64) = 
    if x = 0UL then
        None
    else
        Some(x)

Вы также можете найти эта страница на F # для Fun и Profit полезна.

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