1

当您在 SML 中将运算符定义为数据类型时,它们是否充当运算符的函数?

datatype egexp= egadd of egexp*egexp

egadd 是作为运算符还是函数?我的意思是将表达式 a+b 写为 egadd(a)(b) 还是 (a)egadd(b)?

谢谢你

4

3 回答 3

4

您本质上是在询问中缀语法。这实际上与函数与构造函数无关,两者都可以是中缀或(默认情况下)非修复:

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 标识符。

于 2012-10-08T09:57:41.613 回答
0

你也不写。它作用于“函数”(实际上,作为值构造函数),采用您指定的类型。

也就是说,由于您指定了egadd需要一个egexp * egexp,它需要一个 2 的元组egexps,即:egadd (a, b),其中ab是类型的值egexp

infix如果需要,您可以使用或使其像任何其他函数一样中缀infixr

于 2012-10-07T20:27:27.043 回答
0

egadd是一个“构造函数”。egexp是一种代数数据类型,并且egadd是它的构造函数之一。SML 中的构造函数可以没有参数,也可以只有一个参数(多个“组件”可以打包到 1 个元组参数中)。作为带参数的构造函数,egadd它也是一个函数,它接受该参数类型 ( egexp*egexp) 的参数并返回(“构造”)代数数据类型的值egexp。例如,正如@SebastianPaaskeTørho 提到的,如果ab是 type 的值egexp,则egadd (a, b)构造一个新的 type 值egexp

于 2012-10-08T09:09:44.780 回答