Scala 用第二个论点讨好别人
我需要用几种方法实现快速排序来选择pivot,因此我实现了一个例程,该例程将pivot选择器作为参数。但是具体实现的定义包含很多样板文件,有没有更简洁的方法来定义它们Scala 用第二个论点讨好别人,scala,Scala,我需要用几种方法实现快速排序来选择pivot,因此我实现了一个例程,该例程将pivot选择器作为参数。但是具体实现的定义包含很多样板文件,有没有更简洁的方法来定义它们 private def qsort[a <% Ordered[a]](xs: Stream[a])(choosePivot:Stream[a] => a): Stream[a] = { if(xs.lengthCompare(1) <= 0) xs else { val pivot
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中,如果choose pivot函数是第一个参数,我可以编写类似于qsorhead=qsort head的代码;如果是第二个参数,我可以编写类似于qsorhead xs=qsort xs\ys->head ys的代码。Scala中是否也有类似的内容?对于使用传递参数的lambda表达式,下划线语法是您的朋友:uu.head _.head将被转换为完整表达式x=>x.head我想指出的是,它大部分已经从Scala标准库中逐步淘汰,取而代之的是更通用的。除非你有一个很好的理由使用前者,我不知道,后者可能是一个更好的选择
它可能不会更好,但如果您使用排序,至少您可以摆脱丑陋,我想ys=>xsrng.nextIntxs.length应该是ys=>ysrng.nextIntys.lengthqsorhead xs=qsort xshead@maasg是的,这是我提交的一些错误代码,qsort例程也不正确。多参数列表与curry截然不同。你说的是多个参数列表。@RandallSchulz-我完全同意,看到这两个概念混在一起,我真的很烦。不幸的是,Scala社区似乎喜欢将多个参数列表和curried混为一谈,或者至少模糊了边界。
qsort(xs)(_.head)
def qsortHead[A: Ordering](xs: Stream[A]) = qsort(xs)(_.head)
def qsortLast[A: Ordering](xs: Stream[A]) = qsort(xs)(_.last)
def qsortRandom[A: Ordering](xs: Stream[A]) = qsort(xs)(ys => ys(rng.nextInt(ys.length)))