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

scala – 如何定义引用自身的结构类型?

发布时间:2020-12-16 09:04:58 所属栏目:安全 来源:网络整理
导读:我想创建一个方法求和,我可以调用不同的类型,特别是sum(1,2). def sum[A](a1: A,a2: A) = a1 + a2 这失败是因为编译器无法判断A是否有方法” 我试图定义一个结构类型: type Addable = {def(a:Addable)} 由于非法循环引用,这会失败 如何在不需要A扩展特定特
我想创建一个方法求和,我可以调用不同的类型,特别是sum(1,2).

def sum[A](a1: A,a2: A) = a1 + a2

这失败是因为编译器无法判断A是否有方法”

我试图定义一个结构类型:

type Addable = {def(a:Addable)}

由于非法循环引用,这会失败

如何在不需要A扩展特定特征的情况下以类型安全的方式实现此目的?

解决方法

如果没有其他编译器参数(特别是-Yrecursion),Scala不支持递归类型别名.这部分是为了使类型检查器至少在某种程度上保持可判定性(但是,正如我们已经发现的那样,即使没有递归类型别名,类型系统也是Turing Complete,因此它并不重要).

执行此类操作的正确方法是使用类型类. Scala将这些编码为隐式视图边界.例如:

trait Addable[A] {
  def zero: A
  def add(x: A,y: A): A
}

implicit object IntAddable extends Addable[Int] {
  def zero = 0
  def add(x: Int,y: Int) = x + y
}

implicit object DoubleAddable extends Addable[Double] {
  def zero = 0
  def add(x: Double,y: Double) = x + y
}

// ...

def sum[A](x: A,y: A)(implicit tc: Addable[A]) = tc.add(x,y)

当然,这也允许你做一些奇特的事情,比如以类型安全的方式对Seq的内容进行求和:

implicit def summableSeqSyntax[A](seq: Seq[A])(implicit tc: Addable[A]) = new {
  def sum = seq.foldLeft(tc.zero)(tc.add)
}

List(1,2,3,4).sum        // => 10
List(true,false).sum       // does not compile

值得注意的是,Scala 2.8与Numeric类型类非常接近.

(编辑:李大同)

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

    推荐文章
      热点阅读