Аннотация над типами параметров в неявных объектах или значениях? - PullRequest
3 голосов
/ 27 января 2011

Рассмотрим это применение неявных объектов

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, который абстрагируется от A и B.

Можно ли это сделать и как? Если нет, то разумно ли ожидать расширения языка, обладающего такой способностью?

1 Ответ

4 голосов
/ 27 января 2011

Значения Scala (т. Е. Vals и объекты) мономорфные , поэтому прямого способа получить то, что вам нужно, нет, если вы настаиваете на значениях, подразумеваемых значениями.

Но есть простая альтернатива, если они не должны быть значениями: вы можете использовать что-то, что может быть полиморфным, неявным методом ,

implicit def pairSplitter[A, B] = new Splitter[A, B, Pair[A, B]] {
  override def split(list: List[Pair[A, B]]) : (List[A], List[B]) =
    (list.collect{case (a,_) => a}, list.collect{case (_,b) => b})
} 

REPL сессия ...

scala> splitList(List(("foo",2.0),("bar",3.0)))
res5: (List[java.lang.String], List[Double]) = (List(foo, bar),List(2.0, 3.0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...