【发布时间】:2012-10-08 17:57:41
【问题描述】:
当您在 SML 中将运算符定义为数据类型时,它们是否充当运算符的函数?
点赞datatype egexp= egadd of egexp*egexp
egadd 是作为运算符还是函数?我的意思是将表达式 a+b 写成 egadd(a)(b) 还是 (a)egadd(b)?
谢谢
【问题讨论】:
当您在 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 中的“函数”和“运算符”之间没有区别。您只有非固定与中缀标识符。
【讨论】:
datatype t = op&& of int * int 时,为什么语法似乎允许特殊的op 前缀。这种语法有什么意义?
op+等等。
你也不写。它作用于“函数”(实际上,作为值构造函数),采用您指定的类型。
也就是说,由于您指定egadd 采用egexp * egexp,它采用两个egexps 的元组,即:egadd (a, b),其中a 和b 是@ 类型的值987654327@.
如果需要,您可以使用infix 或infixr 使其像任何其他函数一样中缀。
【讨论】:
egadd 是一个“构造函数”。 egexp 是一个代数数据类型,egadd 是它的构造函数之一。 SML 中的构造函数可以没有参数,也可以只有一个参数(多个“组件”可以打包到 1 个元组参数中)。作为带参数的构造函数,egadd 也是一个函数,它接受该参数类型 (egexp*egexp) 的参数并返回(“构造”)代数数据类型 egexp 的值。例如,正如@SebastianPaaskeTørho 提到的,如果a 和b 是egexp 类型的值,那么egadd (a, b) 构造一个egexp 类型的新值。
【讨论】: