Как определить функцию max для каждого типа с помощью метода «>»? - PullRequest
3 голосов
/ 13 мая 2011

Можно ли определить его обобщенно для всех типов, у которых есть метод > (также все AnyVals), так что достаточно использовать один метод реализации?

Ответы [ 3 ]

4 голосов
/ 13 мая 2011

Вы можете объявить неявное преобразование:

implicit def greater2order[A](self : { def >(that : A) }) : Order[A] = ...

, а затем просто использовать скаляр ...

3 голосов
/ 13 мая 2011

Стандартная библиотека вроде этого уже делает.Но без присвоения типа объекту, имеющему метод > ...

List(1,2,3).max(Ordering.fromLessThan( (a:Int, b:Int) => b > a) )

По сути, этот синтаксис будет работать для всего, что имеет метод > или где какое-то неявное преобразование делает доступным >,Он создает порядок, который можно передать стандартному методу max.

Еще один пример:

case class S(s:String) {
  def >(that:S) = java.text.Collator.getInstance.compare(s, that.s) > 0
}

List(S("abc"), S("ABa"), S("abd")).max(Ordering.fromLessThan( (a:S,b:S) => b>a) )
// res9: S = S(abd)
1 голос
/ 13 мая 2011

Может иметь значение Порядок .

Он охватывает стандартные числовые типы (а затем некоторые - см. «Известные подклассы»).Подсказки могут быть использованы, чтобы «открыть его» для внешних типов.

Счастливое кодирование.

...