当您在 SML 中将运算符定义为数据类型时,它们是否充当运算符的函数?
像datatype egexp= egadd of egexp*egexp
egadd 是作为运算符还是函数?我的意思是将表达式 a+b 写为 egadd(a)(b) 还是 (a)egadd(b)?
谢谢你
您本质上是在询问中缀语法。这实际上与函数与构造函数无关,两者都可以是中缀或(默认情况下)非修复:
fun f (x, y) = ...
val a = f (1, 2)
infix f
val b = 1 f 2
datatype t = C of int * int
val c = C (1, 2)
infix C
val d = 1 C 2
这统一适用于字母数字和符号标识符:
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 中的“函数”和“运算符”之间没有区别。您只有 nonfix vs infix 标识符。
你也不写。它作用于“函数”(实际上,作为值构造函数),采用您指定的类型。
也就是说,由于您指定了egadd
需要一个egexp * egexp
,它需要一个 2 的元组egexps
,即:egadd (a, b)
,其中a
和b
是类型的值egexp
。
infix
如果需要,您可以使用或使其像任何其他函数一样中缀infixr
。
egadd
是一个“构造函数”。egexp
是一种代数数据类型,并且egadd
是它的构造函数之一。SML 中的构造函数可以没有参数,也可以只有一个参数(多个“组件”可以打包到 1 个元组参数中)。作为带参数的构造函数,egadd
它也是一个函数,它接受该参数类型 ( egexp*egexp
) 的参数并返回(“构造”)代数数据类型的值egexp
。例如,正如@SebastianPaaskeTørho 提到的,如果a
和b
是 type 的值egexp
,则egadd (a, b)
构造一个新的 type 值egexp
。