在下面的示例中,我希望允许除零以外的所有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
答案 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有助于娱乐和获利。