Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 用第二个论点讨好别人_Scala - Fatal编程技术网

Scala 用第二个论点讨好别人

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

我需要用几种方法实现快速排序来选择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 = 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)))