有没有人可以给我提出有关在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来实现操作作为类型构造函数,但我仍然在努力实现这个想法,任何提示都会受到高度赞赏。
答案 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。