【问题标题】:When you define operators as datatype in SML, do they act as functions as operators?当您在 SML 中将运算符定义为数据类型时,它们是否充当运算符的函数?
【发布时间】:2012-10-08 17:57:41
【问题描述】:

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

点赞datatype egexp= egadd of egexp*egexp

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

谢谢

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

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

    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 前缀。这种语法有什么意义?
    • @xyz,没有真正意义,它总是多余的。我想这是允许的,这样你就可以在所有地方统一写op+等等。
    【解决方案2】:

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

    也就是说,由于您指定egadd 采用egexp * egexp,它采用两个egexps 的元组,即:egadd (a, b),其中ab 是@ 类型的值987654327@.

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2021-12-03
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        相关资源
        最近更新 更多