在F#中实现约束数字类型的成语/惯例?

时间:2013-12-26 17:02:05

标签: f# refinement-type

假设需要一个允许值在指定范围内的数值数据类型。更具体地说,假设有人想要定义一个整数类型,其最小值为0,最大值为5000.这种情况在许多情况下出现,例如建模数据库数据类型,XSD数据类型等等。

在F#中为这种类型建模的最佳方法是什么?在C#中,一种方法是定义一个实现范围检查重载运算符,格式化等的结构。这里描述了F#中的类似方法:http://tomasp.net/blog/fsharp-custom-numeric.aspx/

我真的不需要一个完全成熟的自定义类型;我真正想要的只是一个带有约束域的现有类型。例如,我希望能够写出类似

的内容
type MyInt = Value of uint16 where Value <= 5000 (pseudocode)

是否有一种速记方式在F#中执行此类操作,或者是实现上述博客文章中所述的自定义数字类型的最佳方法?

2 个答案:

答案 0 :(得分:5)

你指的是类型理论中所谓的细化类型,正如Daniel所指出的那样,寻找F*。但这是一个研究项目。

就使用F#而言,除了Tomas的帖子外,请查看designing with types系列。

答案 1 :(得分:3)

我的建议是实现一个包装数据类型的自定义结构(例如int),就像在C#中一样。

创建此自定义结构的想法是,它允许您在运行时“拦截”基础数据值的所有使用并检查它们的正确性。另一种方法是在编译时检查所有这些用途,这可能与F *(如其他人提到的)一样,尽管它更难以用于日常代码。