Вот вариант ответа Даниэля (и Ретронима).
Если вы просто хотите, чтобы предикат (из списка) был успешным, тогда вы можете использовать
def findP[T](list: Iterable[T], preds: Iterable[T=>Boolean]) = {
list.view.map( x => (x , preds.find( _(x) )) ).find( _._2.isDefined )
}
Кроме того, вы можете использовать список именованных предикатов:
def findP[T](list: Iterable[T],preds: Iterable[(T=>Boolean,String)]) = {
list.view.map(x => (x , preds.find( _._1(x) ))).find( _._2.isDefined )
}
scala> findP(
| List(1,2,3,4,5,6),
| List( ((i:Int)=>i>4,"Fred") , ((i:Int)=>(i%6)==0,"Barney"))
| )
res2: Option[(Int, Option[((Int) => Boolean, String)])] =
Some((5,Some((<function1>,Fred))))
Результат немного сумбурный, но его можно легко развернуть, чтобы получить именно то, о чем вы просили:
def findP[T](list: Iterable[T],preds: Iterable[(T=>Boolean,String)]) = {
list.view.map(x => (x , preds.find( _._1(x) ))).find( _._2.isDefined ) match {
case Some((i,Some((_,s)))) => Some((i,s))
case _ => None
}
}
(Это код для 2.8; переключите «просмотр» в «проекцию» для 2.7.)