Scala 隐式对象或值中参数类型的抽象?

Scala 隐式对象或值中参数类型的抽象?,scala,abstraction,implicit,Scala,Abstraction,Implicit,考虑隐式对象的这种应用 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]) = (l

考虑隐式对象的这种应用

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)编写此代码没有问题,但我看不到编写隐式对象或val的方法,该对象或val对A和B进行抽象

这能做到吗?如何做到?如果没有,那么期待一个具有这种能力的语言扩展是否合理?

Scala的值(即VAL和对象)是单态的,因此如果坚持隐式是值,就没有直接的方法可以得到您想要的

但如果它们不一定是值的话,有一个简单的替代方法:你可以使用多态的东西,一种隐式方法

回复会话

scala> splitList(List(("foo",2.0),("bar",3.0)))
res5: (List[java.lang.String], List[Double]) = (List(foo, bar),List(2.0, 3.0))

哦!不知何故,当我添加第二个隐式方法时(无论是哪种方法),我都希望得到臭名昭著的模糊错误,但显然这是胡说八道。工作起来很有魅力!
scala> splitList(List(("foo",2.0),("bar",3.0)))
res5: (List[java.lang.String], List[Double]) = (List(foo, bar),List(2.0, 3.0))