暗黙のオブジェクトのこのアプリケーションを検討してください
trait Splitter[A,B,C] {
def split(list: List[C]):(List[A],List[B])
}
implicit object PairSplitter extends Splitter[Int, String, Pair[Int,String]] {
override def split(list: List[Pair[Int,String]]):(List[Int],List[String]) =
(list.collect{case (a,_) => a}, list.collect{case (_,b) => b})
}
implicit object EitherSplitter extends Splitter[Int, String, Either[Int,String]] {
override def split(list: List[Either[Int,String]]):(List[Int],List[String]) =
(list.collect{case Left(a) => a}, list.collect{case Right(b) => b})
}
def splitList[A,B,C](list:List[C])(implicit splitter:Splitter[A,B,C]):(List[A],List[B]) = splitter.split(list)
println(splitList(List((1,"one"),(2,"two"))).isInstanceOf[(List[Int],List[String])])
println(splitList(List[Either[Int,String]](Left(42),Right("two"))).isInstanceOf[(List[Int],List[String])])
//println(splitList(List(1,2,3,4))) //won't compile
それは機能しますが、明らかにそれほど有用ではありません。例のIntやStringのような具象型に対してこれを書くことは問題ありませんが、AとBを抽象化する暗黙のオブジェクトまたはvalを書く方法がわかりません。
これはどのように行うことができますか?そうでない場合、この機能を備えた言語拡張を期待するのは合理的ですか?