2017-03-26 10 views
0

私はcaseクラスのStateを持ち、そこからVariableクラスを拡張したい。 Variableクラスではコンストラクタでのみ値が必要です。 runはどこに置くことができますか? UPDATE 型はパラメータを取らないScala

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

問題は、 mapを使用するVariableを使用します。mapは、のスーパータイプのみであるStateを定義しています。 mapのみを使用して、サブクラスの追加情報を設定する方法をプログラムで知ることができますか?それは、サブクラスが、同じクラスのエイリアスでないようにあなたは、type Variable[+A] = State[A, A]を定義する場合Stateはその型パラメータSで不変であるので、

しかし、あなたは、いくつかの分散の誤差がありますので、Variableもなければなりません。

関連する問題