在SML中将运算符定义为数据类型时,它们是否作为运算符的函数?
在SML中将运算符定义为数据类型时,它们是否作为运算符的函数 像在SML中将运算符定义为数据类型时,它们是否作为运算符的函数?,sml,smlnj,Sml,Smlnj,在SML中将运算符定义为数据类型时,它们是否作为运算符的函数 像datatype egexp=egexp的egadd*egexp egadd是否作为操作员或功能?我的意思是,我应该把表达式a+b写成egadd(a)(b)还是(a)egadd(b) 谢谢你你都没写。它作用于一个“函数”(实际上是一个值构造函数),采用您指定的类型 也就是说,由于您指定egadd采用egexp*egexp,因此它采用两个egexp的元组,即:egadd(a,b),其中a和b是egexp类型的值 如果需要,可以使用in
datatype egexp=egexp的egadd*egexp
egadd是否作为操作员或功能?我的意思是,我应该把表达式a+b写成egadd(a)(b)还是(a)egadd(b)
谢谢你你都没写。它作用于一个“函数”(实际上是一个值构造函数),采用您指定的类型 也就是说,由于您指定
egadd
采用egexp*egexp
,因此它采用两个egexp
的元组,即:egadd(a,b)
,其中a
和b
是egexp
类型的值
如果需要,可以使用
infix
或infixr
将其设置为与任何其他函数一样的中缀 egadd是一个“构造函数”egexp
是一种代数数据类型,egadd
是其构造函数之一。SML中的构造函数可以没有参数,也可以只有一个参数(多个“组件”可以打包成一个元组参数)。作为带参数的构造函数,egadd
也是一个函数,它接受该参数类型的参数(egexp*egexp
)并返回代数数据类型egexp
的值(“构造”)。例如,正如@SebastianPaaskeTørho所提到的,如果a
和b
是egexp
类型的值,那么egadd(a,b)
构造了一个egexp类型的新值,你本质上是在询问中缀语法。这实际上与函数与构造函数无关,两者都可以是中缀或(默认情况下)非中缀:
这统一适用于字母数字和符号标识符:
fun ++ (x, y) = ...
val a = ++ (1, 2)
infix ++
val b = 1 ++ 2
datatype t = && of int * int
val c = && (1, 2)
infix &&
val d = 1 && 2
也就是说,SML中的“函数”和“运算符”没有区别。您只需要使用非IX和中缀标识符
fun ++ (x, y) = ...
val a = ++ (1, 2)
infix ++
val b = 1 ++ 2
datatype t = && of int * int
val c = && (1, 2)
infix &&
val d = 1 && 2