【问题标题】:How to Sum of Custom datatype of int in SML?如何在 SML 中对 int 的自定义数据类型求和?
【发布时间】:2014-07-19 18:18:49
【问题描述】:

我是 SML 的新手,正在使用数据类型等,例如,我有这种数据类型:

datatype test = UInt of int

据我了解,UInt 应该像普通 int 一样工作,但我不能让它做一些简单的事情,比如 sum 2 UInt:

val x = UInt(2)
val y = UInt(3)
val z = x + z

这段代码给了我这个错误:

= stdIn:4.11 Error: overloaded variable not defined at type
  symbol: +
  type: test

我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: sml smlnj custom-data-type


    【解决方案1】:

    默认情况下,+ 定义为两种类型——ints 和 reals,类型分别为 int * int -> intreal * real -> real。它没有为您的类型定义test

    您可以重新定义+ 以处理test 类型,如下所示:

    val (op+) = fn (UInt x, UInt y) => UInt (x + y)
    

    但是,重新定义内置插件通常不是最好的主意。您还可以定义一个函数,该函数将采用任何 int * int -> int 函数并为您提供一个 test * test -> test 函数,其行为如下所示:

    fun lift f = fn (UInt x, UInt y) => UInt (f(x,y))
    

    使用此方法,您可以将测试类型的加法定义为val liftedAdd = lift (op+),并将此类函数用于test 类型的所有工作。

    但是,没有太多充分的理由来创建一个数据类型,它只是一个已经存在的类型的包装器,没有额外的信息。您可能正在寻找 type 关键字,它将定义一个新类型,使其与已存在的类型相等。

    例如,如果你说:

    type test = int
    val x : test = 2
    val y : test = 3
    val z = x + y
    

    添加会起作用,因为虽然xy 都是tests,并且+ 是在ints 上定义的,但test 只是int 的别名。

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 1970-01-01
      • 2021-01-24
      • 2017-09-29
      • 2023-03-14
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多