如何在SML中对int的自定义数据类型求和?
我是SML新手,正在使用数据类型,例如,我有以下数据类型:如何在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
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
的别名