如果我有一个具有以下签名的方法:
def max[T <% Ordered[T]](list:List[T]): T={
//return max. element of List (for example)
}
我想给它一个像这样的对列表:
val fu:List[Pair[String, Double]] = List(Pair("a", 3.1),Pair("b", 1.7),Pair("c", 3.1),Pair("d", 5.4))
如何在列表的第二个元素上定义排序,以便我能够在函数中使用它?
我试着用
implicit def wrapper(p: Pair[String, Double])=new runtime.RichDouble(p._2)
隐式转换成对的 Double 为 RichDouble,它扩展了有序特征,但这是行不通的。
最佳答案
给出:
scala> def max[T <% Ordered[T]](xs: List[T]) = xs.max
max: [T](xs: List[T])(implicit evidence$1: T => Ordered[T])T
scala> case class Pair(x: String, y: Double)
defined class Pair
您需要为
Pair
定义排序对象:scala> implicit val order = scala.math.Ordering.by[Pair, Double](_.y)
order: scala.math.Ordering[Pair] = scala.math.Ordering$$anon$7@3b2e9a90
然后你会发现你的
max
函数适用于 Pair
sscala> max(List(Pair("foo", 1), Pair("bar", 2), Pair("baz", 2.2)))
res5: Pair = Pair(baz,2.2)
关于scala - 查看绑定(bind)方法、有序 Trait 和隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13806335/