2017-01-23 10 views
1

は型クラス、私は信じて、次のことを考える:私はその後、List[A]を返し、入力queryFilterValuesにフィルタリングして、カレーList[A]をフィルタリングするfilterFnを定義し一般的なフィルタタイプクラスを作成しますか?

trait Element[A, B] { 
    val input: A 
    val filteredValue: Option[B] 
    } 

、すなわちフィルタリングされているもの:

def filterFn[A, B](queryFilterValues: List[B]) 
        (implicit ev: A => Element[A, B]): List[A] => List[A] = 
    elements => { 
    queryFilterValues match { 
     case _ :: _ => elements.flatMap { e => 
      ev(e).filteredValue match { 
      case Some(v) => if(queryFilterValues.contains(v)) List(e.input) else Nil 
      case None => List.empty 
      } 
     } 
     case Nil => elements.map(_.input) 
     } 
    } 

次に、Person => Element[Person, String]のインスタンスと共にPersonを作成しました。

最後に、私はそれを使用しようとしました:

// Filter on these names 
val nameFilters = List("jane", "joe", "will") 

val joe = Person(Some("joe")) 

// Expect to get a `List(joe)` back since `joe#name` exists in the list. 
scala> filterFn(nameFilters)(List[Person](joe)) 

しかし、私は、次のコンパイル時にエラーが発生します:

<console>:20: error: type mismatch; 
found : List[Person] 
required: ? => Element[?,String] 
     filterFn(nameFilters)(List[Person](joe)) 

答えて

3

お問い合わせの際filterFnの署名が

def filterFn[A, B](queryFilterValues: List[B]) 
       (implicit ev: A => Element[A, B]) 

ですそれで

filterFn(nameFilters)(List[Person](joe)) 

第2引数としてList[Person](joe)を渡しています。しかし、あなたが定義した署名は、あなたが

found : List[Person] 
required: ? => Element[?,String] 
+0

を参照してください理由は、はいああですElement[A, B]

からAから機能を期待しています。私の間違い - 感謝します。 –

関連する問題