ピボットを選択するいくつかの方法でクイックソートを実装する必要があるため、ピボット チューザーをパラメーターとして受け取るルーチンを実装しました。しかし、具体的な実装の定義には多くのボイラープレートが含まれています。それらを定義するより簡潔な方法はありますか?
private def qsort[a <% Ordered[a]](xs: Stream[a])(choosePivot:Stream[a] => a): Stream[a] = {
if(xs.lengthCompare(1) <= 0) xs
else {
val pivot = choosePivot(xs)
val l = xs.filter(_ < pivot)
val r = xs.filter(_ > pivot)
qsort(l)(choosePivot) ++ pivot#::qsort(r)(choosePivot)
}
}
def qsortHead[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys.head)
def qsortLast[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys.last)
def qsortRandom[a <% Ordered[a]](xs: Stream[a]) = qsort(xs)(ys => ys(rng.nextInt(ys.length)))
Haskell ではqsortHead = qsort head
、ピボット関数の選択が最初のパラメーターであるかqsortHead xs = qsort xs (\ys -> head ys)
、2 番目のパラメーターであるかのように書くことができます。Scalaに似たようなものはありますか?