类构造函数引用返回类的类型成员

时间:2018-01-27 21:00:46

标签: scala

我正在尝试实现一个用于描述自动机的案例类。我目前正在做以下事情:

case class Automaton(alphabet: Set[String], initial: String, finish: Set[String],
  transitions: Map[String, self.Transition] { self =>

  trait Transition

  // concrete things omitted
}

请注意我希望如何定义transitions。我希望这对你有意义,我想以这种方式实现。但是,当我尝试编译时,编译器报告了以下错误:

Error:(21, 47) not found: value self
                     transitions: Map[String, self.Transition]) {

我理解错误。但是,我怎么能强制过渡是属于我描述的自动机的确切过渡?知道怎么解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。当然这不能打字检查。即使它确实如此,我也无法实例化此类型的任何实例。为了避免这种情况,我需要定义依赖函数。

trait DepFunc {
  def apply(automaton: Automaton): Map[String, automaton.Transition]
}

然后在case类的主体内部,我可以构造transitions

val transitions: Map[String, self.Transition] = transitionsGen(this)

另外一个观察结果是,Scala的类型系统不足以描述依赖函数。例如,DepFunc无法描述上面的特征Function1,这是因为在类型级别,scala不允许引用变量名称。这给出了斯卡拉无法处理依赖类型的具体感觉。