ocaml中的类型级整数

时间:2011-08-30 13:18:22

标签: types ocaml gadt

有没有人可以给我提出有关在OCaml(3.12)中支持加法和减法操作的类型级整数的建议/建议?

例如,如果我的数字代表如下:

type zero
type 'a succ
type pos1 = zero succ
type pos2 =  zero succ succ
...

我需要一种在类型上定义函数的方法:

val add: pos2 -> pos1 -> pos3

小背景: 我正在尝试为物理维度上的操作移植一些haskell代码,并且我需要能够在维度类型上定义操作(7种类型级别的记录表示7个基本SI单位的指数)。 我需要这样做以避免动态绑定(使用对象时)并使编译器能够静态地评估和检查所有这些表达式。

我目前的理解是我应该创建一个GADT来实现操作作为类型构造函数,但我仍然在努力实现这个想法,任何提示都会受到高度赞赏。

3 个答案:

答案 0 :(得分:4)

您可能也对Sam Lindley在2008年ML研讨会上发表的文章Many Holes in Hindley-Milner感兴趣。

答案 1 :(得分:3)

您可以使用Oleg的许多惊人结构之一:http://caml.inria.fr/pub/ml-archives/caml-list/2009/07/2984f23799f442d0579faacbf4e6e904.en.html

Jane Street提出了另一个使用一流模块的建议。

http://ocaml.janestreet.com/?q=node/81

免责声明:我大多赞赏这种远程节目。

答案 2 :(得分:0)

你的例子让我觉得你正在尝试做类似

的prolog风格逻辑数字
type fancyInt = Zero | Succ of fancyInt ;;

然后添加

let rec add a b = match a with Zero -> b | Succ c -> add c (Succ b);;

您的背景故事暗示了一个不同的解决方案,创建一个代表距离的类。根据需要在内部存储值,然后提供一个界面,允许您以当时所需的单位获取和设置距离。或者,如果您想要使用功能方法,只需为您的单元创建类型,那么功能与Ocaml本身处理此类事物的方式相同,即meter_of_km。