在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

在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
类型的值


如果需要,可以使用
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