2016-09-09 9 views
0

私のプロジェクト全体で型板を使用しようとすると、次の問題が発生しました。Scalaでtypeclass AとBを実装している要素のリスト

trait FooAble[T] { def fa(t: T): List[T] } 
object Foo { def apply[T](t: T) = implicitly[FooAble[T]].fa(t) } 

trait BarAble[T] { def fb(t: T): Double } 
object Bar { def apply[T](t: T) = implicitly[BarAble[T]].fb(t) } 

し、次の操作を行うことができるようにしたいと思います:SomethingA[]B[]を実装する場合、我々が知らないよう

// xs contains elements of type A and B which are subclasses of the trait Something 
def f(xs: List[Something]) = { 
    val something = xs.map(Foo) 
    val somethingElse = xs.map(Bar) 
} 

しかし、これは動作しないと、暗黙の実装が見つかりませんでした。リストxsの要素がタイプメックFooAbleBarAbleを実装するためには、何をする必要がありますか?

+0

:あなたのタイプのクラスFooAble & BarAbleと機能fになるためのあなたのメソッドシグネチャを実装する暗黙オブジェクトを提供? –

答えて

0

私はこの質問:What are type classes in Scala useful for?はタイプクラスの適切な使用(&有用性)を理解するのに役立つと思います。ちょうどあなたのユースケースのために上記のリンクにケビン・ライトで答えを拡張

アム(私が正しくあなたの必要性を理解していれば!):上記に

trait Addable[T] { 
    def zero: T 
    def append(a: T, b: T): T 
} 

trait Productable[T] { 
    def zero: T 
    def product(a: T, b: T): T 
    } 

implicit object IntIsAddable extends Addable[Int] { 
    def zero = 0 
    def append(a: Int, b: Int) = a + b 
    } 

implicit object IntIsProductable extends Productable[Int] { 
    def zero = 1 
    def product(a: Int, b: Int) = a*b 
    } 

def sumAndProduct[T](xs: List[T])(implicit addable: Addable[T], productable: Productable[T]) = 
    (xs.foldLeft(addable.zero)(addable.append), xs.foldLeft(productable.zero)(productable.product)) 

ので似、ご使用の場合には、以下を行う必要がありあなたが実際にここでやろうとしている何

def f[Something](xs: List[Something])(implicit fooable: FooAble[Something], barable: BarAble[Something]) 
関連する問題