类型不带参数Scala

时间:2017-03-26 05:42:44

标签: scala constructor

我有case类State并希望从中扩展Variable类;但是在Variable类中只需要构造函数中的值。我在哪里可以放run函数?

case class State[S, +A](run: S => (A, S)) {
//.....has `map` function
  def map[B, X >: State[S, B]](f: A => B): X =
    State(state => {
      val (a, s2) = run(state)
      (f(a), s2)
    })
}

class Variable[+A](value: A) extends State[A, A] { // ERROR

  def get: Variable[A] =
    map(x => x)
  def set(newValue: A): Variable[A] =
    map(_ => newValue)
}

更新 我改成了这样的东西:

class Variable[+A](value: A, run: A => (A, A)) extends State[A, A](run) {
  def get: Variable[A] =
    map(x => x) // ERROR HERE
  def set(newValue: A): State[A, A] =
    map(_ => newValue)
}
object Variable {
  def create[A](value: A): Variable[A] = new Variable[A](value, x => (x, x))
}

但我收到了错误:

类型不匹配;发现:com.libs.State [A,A] required:com.libs.Variable [A] Variable.scala / scala / src / com / libs line 4 Scala问题

1 个答案:

答案 0 :(得分:1)

问题在于,您无法使用Variable定义map,因为map定义的State只是Variable的超类型。您的程序如何只使用map

知道如何设置子类的附加信息

但是,如果定义type Variable[+A] = State[A, A],因此它不是子类而是同一个类的别名,则会出现一些方差错误,因为State在其类型参数{{}中是不变的1}},所以S也必须如此。