2016-08-19 2 views
0

具体的なコンテナサブタイプを返すような "map"メソッドを実装したいと思います。F-Bounded Polymorphismを使用してFunctorのようにマップを定義する方法はありますか

trait Result[+T, Self[A] <: Result[A, Self]] { 
    def map[A](f: T => A): Self[A] 
} 


case class Value[T](t: T) extends Result[T, Value[T]] { 
    override def map[A](f: (T) => A): Value[A] = Value(f(t)) 
} 

しかし、これはコンパイルされません。何か不足していますか?

答えて

0

「結果」タイプの第2パラメータは、より高い種類のタイプを必要とします。「値[T]」ではなく、単純な「値」です。

trait Result[+T, Self[A] <: Result[A, Self]] { 
    def map[A](f: T => A): Self[A] 
} 


case class Value[T](t: T) extends Result[T, Value] { 
    override def map[A](f: T => A): Value[A] = Value(f(t)) 
} 

val v = Value(1) 

v.map(x ⇒ (x * 2) + "ab") // Value(2ab) 
関連する問題