Я играл вокруг с Scala недавно, и думал о том, как реализовать универсальную версию quicksort в нем (только для получения лучшего сопереживания языку)
Я придумал что-то вроде этого
object Main {
def qs[T](a: List[T], f: (T, T) => Boolean): List[T] = {
if (a == Nil) return a
val (l, g) = a drop 1 partition (f(a(0),(_:T)))
qs(l, f) ::: List(a(0)) ::: qs(g, f)
}
def main(args: Array[String]): Unit = {
val a = List(5,3,2,1,7,8,9,4,6)
val qsInt = qs(_: List[Int], (_: Int) > (_: Int))
println(qsInt(a))
}
}
Это не столь универсально, как я хотел, чтобы это было, так как я должен явно заявить, как заказать элементам скорее затем просто выполнение чего-то как
val (l, g) = a drop 1 partition (a(0) >)
Как я могу сказать компилятору, что T только должен реализовать большее - чем оператор, чтобы быть поддающимся сортировке этой функцией?
С уважением
def qsort[T <% Ordered[T]](list: List[T]): List[T] = {
list match {
case Nil => Nil
case x::xs =>
val (before, after) = xs partition (_ < x)
qsort(before) ++ (x :: qsort(after))
}
}
Поскольку Роджер рассмотрел случай Заказанный
], позвольте мне рассказать о Заказе
:
def qsort[T](list: List[T])(implicit ord: Ordering[T]): List[T] = list match {
// import ord._ // enables "_ < x" syntax
case Nil => Nil
case x :: xs =>
val (before, after) = xs partition (ord.lt(_, x))
qsort(before) ::: x :: qsort(after)
}
Использование Порядок
имеет два основных Преимущества:
T
не обязательно должен быть создан как Упорядоченный
. Например, в Scala 2.8:
def sortIgnoreCase(strs: List[String]) = {
val myOrdering = Ordering.fromLessThan { (x: String, y: String) =>
x.toLowerCase < y.toLowerCase
}
qsort(strs)(myOrdering)
}