【问题标题】:How to define a cyclic type definition?如何定义循环类型定义?
【发布时间】:2010-11-18 05:15:09
【问题描述】:

这不是一个有效的类型定义:

scala>  type Addable = { def +(subject: Addable) }
<console>:4: error: illegal cyclic reference involving type Addable
        type Addable = { def +(subject: Addable) }

这可以用scala表达吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    不,它不能。

    在 Scala 语言规范 2.7 版的第 40 页:

    但是,如果一个 类型别名递归地引用 定义类型构造函数本身。那 是,类型别名中的类型 T type t[tps] = T 可能不直接或间接引用名称 t.

    【讨论】:

      【解决方案2】:

      这是我在自己编写的库中所做的,HTH:

        trait Addable {
          type AddableType <: Addable
          def + (subject: AddableType): AddableType
        }
        trait Rational extends Addable {
          type AddableType = Rational
          override def + (subject: Rational): Rational 
        }
      

      【讨论】:

      • 定义必须是结构类型,因为下划线类不能更改(如 Int、Long)。
      • 嗯,也许您可​​以定义一个视图(隐式 def)来将这些类转换为 Addable?
      【解决方案3】:

      这似乎在 Scala 2.8 中已“修复”:

      http://lampsvn.epfl.ch/trac/scala/ticket/1291

      【讨论】:

      • 它不适用于当前的夜间构建。欢迎使用 Scala 版本 2.8.0.r18457-b20090810020144(Java HotSpot(TM) Client VM,Java 1.6.0_12)。输入表达式以对其进行评估。键入 :help 以获取更多信息。 scala> 类 A{ | type Addable = { def +(subject: Addable) } | } :5: error: 非法循环引用涉及方法 + type Addable = { def +(subject: Addable) } 至少错误信息改变了:-)。
      • 你试过上面文章底部提到的实验性命令行选项吗?
      • 与以下结果相同:scala -Yrecursion 10
      猜你喜欢
      • 1970-01-01
      • 2015-09-05
      • 2014-11-18
      • 1970-01-01
      • 2019-02-21
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多