Учитывая следующее, я считаю, тип класса:Написать класс фильтра фильтра?
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))
Ах да. Моя ошибка. –