在F#中,是否可以限制单个案例区分联合中的值范围?

时间:2018-09-27 04:15:29

标签: f#

在下面的示例中,我希望允许除零以外的所有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 :(得分:4)

据我所知,您不能直接在值上设置界限(如果其他人知道,请告诉我们)。我认为这就是所谓的“依赖类型”,我不相信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#上的this page有助于娱乐和获利。