2017-01-23 3 views
1

Учитывая следующее, я считаю, тип класса:Написать класс фильтра фильтра?

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

Я тогда определяется filterFn для фильтрации на входе queryFilterValues, а затем фильтровать выделанной List[A], возвращая List[A], то есть то, что было отфильтровано:

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, наряду с Person => Element[Person, String] например:

case class Person(name: Option[String]) 
object Person { 
    implicit def personToElement(p: Person) = new Element[Person, String] { 
    val input   = p 
    val filteredValue = p.name 
    } 
} 

Наконец, я пытался использовать:

// 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)) 

Вы передаете List[Person](joe) в качестве второго аргумента. Но подпись вы определили ожидает функцию от A к Element[A, B]

Вот почему вы видите

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

Ах да. Моя ошибка. –

Смежные вопросы