在scala中划分元组序列

在scala中划分元组序列,scala,Scala,我经常编写相同的代码来划分元组序列: def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))} 有更好的方法吗?ScalazfoldMap更清晰,但效率可能更低: import scalaz._, Scalaz._ def groupBy[A, B](l: List[(A,B)]) = l foldMap {

我经常编写相同的代码来划分元组序列:

def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))}

有更好的方法吗?

Scalaz
foldMap
更清晰,但效率可能更低:

import scalaz._, Scalaz._

def groupBy[A, B](l: List[(A,B)]) = l foldMap {t => Map(t._1 → List(t._2))}
由于Scalaz仅为具体类型(如
List
Vector
)提供类型类实例,因此只能使用这些实例,而不能使用
Seq
。如果需要通用版本,可以显式使用typeclass:

def groupBy[S[_]: Foldable, A, B](s: S[(A, B)]) =
   s foldMap {t => Map(t._1 → List(t._2))}

这将适用于
列表
向量
,或者通常适用于任何可折叠的
S[]:但仍然不适用于您不知道具体类型的
Seq

您的
groupBy
签名非常具体,因此标准库中没有一种方法可以做到这一点。看起来很简洁?稍微简洁一点:
groupBy(u._1).mapValues(u.map(u._1))
,但随后您遇到了
mapValues的问题