加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用无符号和签名的ints设计编号系统

发布时间:2020-12-16 19:08:19 所属栏目:安全 来源:网络整理
导读:我正在设计一个围绕无符号整数和有符号整数的编号系统.这两种类型都具有代表 Scala数字系统中的数字的基础值.以下是我到目前为止的类型层次结构. sealed trait Number { def + (num : Number) : Number = ??? def - (num : Number) : Number = ??? def * (nu
我正在设计一个围绕无符号整数和有符号整数的编号系统.这两种类型都具有代表 Scala数字系统中的数字的基础值.以下是我到目前为止的类型层次结构.

sealed trait Number {
  def + (num : Number) : Number = ???
  def - (num : Number) : Number = ???
  def * (num : Number) : Number = ???
}

sealed trait SignedNumber extends Number

sealed trait UnsignedNumber extends Number

sealed trait UInt32 extends UnsignedNumber {
  def underlying : Long
}

sealed trait UInt64 extends UnsignedNumber {
  def underlying : BigInt
}

sealed trait Int32 extends SignedNumber {
  def underlying : Int
}

sealed trait Int64 extends SignedNumber {
  def underlying : Long
}

我想在trait Number中定义底层,因此编译器可以强制在所有子项中定义底层.然而,底层的类型因每个特征而有所不同 – 我希望为每种类型保留尽可能小的类型.例如,UInt32可以存储在Scala中,而UInt64需要作为BigInt存储.

最有效的方法是什么?

解决方法

您可以在父特征中声明一个类型,并在子目录中覆盖它.

sealed trait Number {
  type A
  def underlying: A
  def + (num : Number) : Number = ???
  def - (num : Number) : Number = ???
  def * (num : Number) : Number = ???
}

sealed trait SignedNumber extends Number

sealed trait UnsignedNumber extends Number

sealed trait UInt32 extends UnsignedNumber {
  override type A = Long
}

sealed trait UInt64 extends UnsignedNumber {
  override type A = BigInt
}

sealed trait Int32 extends SignedNumber {
  override type A = Int
}

sealed trait Int64 extends SignedNumber {
  override type A = Long
}

一个例子只是为了显示使用路径依赖类型,以防不清楚:

def getUnderlying(x: Number): x.A = x.underlying

为了使返回类型正确,我认为可能需要另一种类型.

sealed trait Number {
  type A
  type B
  def underlying: A
  def +(that: B): B
}

sealed trait UInt32 extends Number { x =>
  override type A = Long
  override type B = UInt32
  override def +(y: B): B = new UInt32 {
    // todo - naive implementation,doesn't check overflow
    override val underlying = x.underlying + y.underlying
  }
}

def main(args: Array[String]) {
  print((
    new UInt32 { def underlying = 3 } +
    new UInt32 { def underlying = 4 }
  ).underlying)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读