【发布时间】:2011-02-11 01:40:52
【问题描述】:
是否可以在 Scala 中做 this 之类的事情?
【问题讨论】:
-
恕我直言,问题应该是自包含的。更多细节的链接是可以的,但在这里引用两行haskell-code不会太多工作。
标签: scala lazy-evaluation quicksort
是否可以在 Scala 中做 this 之类的事情?
【问题讨论】:
标签: scala lazy-evaluation quicksort
是的!
Scala 支持“惰性 vals”作为一种将值的计算推迟到实际使用的方法。 Scala 2.8 库的大部分内容都能够处理延迟定义的集合。
【讨论】:
def quicksort[A](xs: Stream[A])(implicit o: Ordering[A]): Stream[A] = {
import o._
if (xs.isEmpty) xs else {
val (smaller, bigger) = xs.tail.partition(_ < xs.head)
quicksort(smaller) #::: xs.head #:: quicksort(bigger)
}
}
它也可以用视图来完成,虽然它肯定会慢得多:
def quicksort[A](xs: List[A])(implicit o: Ordering[A]) = {
import o._
def qs(xs: SeqView[A, List[A]]): SeqView[A, Seq[_]] = if (xs.isEmpty) xs else {
val (smaller, bigger) = xs.tail.partition(_ < xs.head)
qs(smaller) ++ (xs.head +: qs(bigger))
}
qs(xs.view)
}
【讨论】:
.head……真傻。
quicksort[A <% Ordering[A]](xs: List[A]) = {替换第一行吗?
sorted、sortBy、sortWith 等的实现。或者是吗?有没有办法只使用库内置函数来懒惰地排序? sorted 不是“变形金刚”吗?文档说 Stream “懒惰地实现了它所有的转换器方法”,但据我所知,这里的情况似乎并非如此?