在F#中,是否有可能在一个单独的区分并集中限制值的范围?

在F#中,是否有可能在一个单独的区分并集中限制值的范围?,f#,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 就我所知,您不能直接对值设置边界(如果其他人知道其他情况,请务必让我们知道)。我认为这就是所谓的“依赖类型”,我不相信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

就我所知,您不能直接对值设置边界(如果其他人知道其他情况,请务必让我们知道)。我认为这就是所谓的“依赖类型”,我不相信F#支持,至少目前不支持

我猜您已经很清楚以下几点,但为了让其他人看一看,我将讨论您在运行时如何处理此问题:我认为最简单的方法是将类型设为私有,并只公开一个在当时进行自定义验证的getFoo函数。根据需要,您可以将其包装在选项中,或者在传入错误号码时引发异常。例如

type private FooWithException = 
    | Foo of uint64

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


你可能会发现在F#for Fun and Profit很有用。

你可能需要为此拿出大炮:;-)另请参见或感谢,我知道这种方法。不幸的是,我的用例非常狭窄和具体,这是行不通的。为了他人的利益,标记为已接受。
type private FooOption = 
    | Foo of uint64 option

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