如何在SML中对int的自定义数据类型求和?

如何在SML中对int的自定义数据类型求和?,sml,smlnj,custom-data-type,Sml,Smlnj,Custom Data Type,我是SML新手,正在使用数据类型,例如,我有以下数据类型: datatype test = UInt of int 据我所知,UInt应该像正常的int一样工作,但我不能让它做简单的事情,比如sum 2 UInt: val x = UInt(2) val y = UInt(3) val z = x + z 此代码给出了以下错误: = stdIn:4.11 Error: overloaded variable not defined at type symbol: + type: te

我是SML新手,正在使用数据类型,例如,我有以下数据类型:

datatype test = UInt of int
据我所知,UInt应该像正常的int一样工作,但我不能让它做简单的事情,比如sum 2 UInt:

val x = UInt(2)
val y = UInt(3)
val z = x + z
此代码给出了以下错误:

= stdIn:4.11 Error: overloaded variable not defined at type
  symbol: +
  type: test
我怎样才能做到这一点


谢谢

默认情况下,
+
为两种类型定义--
int
s和
real
s,分别为
int*int->int
real*real->real
。它不是为您的类型
测试定义的

您可以重新定义
+
以处理
测试
类型,如下所示:

val (op+) = fn (UInt x, UInt y) => UInt (x + y)
fun lift f = fn (UInt x, UInt y) => UInt (f(x,y))
然而,重新定义内置程序通常不是最好的主意。您还可以定义一个函数,该函数将接受任何
int*int->int
函数,并为您提供一个
test*test->test
函数,其行为如下所示:

val (op+) = fn (UInt x, UInt y) => UInt (x + y)
fun lift f = fn (UInt x, UInt y) => UInt (f(x,y))
使用此方法,您可以将测试类型的添加定义为
val-liftedAdd=lift(op+
),并将此类函数用于测试类型的所有工作

然而,没有太多理由创建一个数据类型,它只是一个已经存在的类型的包装器,而不需要任何附加信息。您可能正在查找
type
关键字,该关键字将定义一个新类型,使之等于已经存在的类型

例如,如果你说:

type test = int
val x : test = 2
val y : test = 3
val z = x + y
添加将起作用,因为虽然
x
y
都是
test
s,并且
+
是在
int
s上定义的,
test
只是
int
的别名