在F#中,是否有可能在一个单独的区分并集中限制值的范围?
在下面的示例中,我希望允许除零之外的所有uint64在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#支持,至少目前不支持
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)