小编Lor*_*Goo的帖子

Scala递归与循环:性能和运行时考虑因素

我编写了一个天真的测试平台来测量三种阶乘实现的性能:基于循环,非尾递归和尾递归.

令我惊讶的是,最差的性能是循环的(«while»预计效率更高,所以我提供了两者) ,其成本几乎是尾部递归替代的两倍.

答案:修复循环实现,避免使用BigInt的*=运算符,因为其内部«循环»变得如预期的那样快

我遇到的另一个"woodoo"行为是StackOverflow异常,在非尾递归实现的情况下,对于相同的输入没有抛出异常.我可以通过逐步调用具有越来越大的值的函数来规避StackOverlow ...我感到很疯狂:) 答案:JVM需要在启动期间收敛,然后行为是连贯的和系统的

这是代码:

final object Factorial {
  type Out = BigInt

  def calculateByRecursion(n: Int): Out = {
    require(n>0, "n must be positive")

    n match {
      case _ if n == 1 => return 1
      case _ => return n * calculateByRecursion(n-1)
    }
  }

  def calculateByForLoop(n: Int): Out = {
    require(n>0, "n must be positive")

    var accumulator: Out = 1
    for (i <- 1 to n)
      accumulator = i * accumulator
    accumulator
  }

  def calculateByWhileLoop(n: …
Run Code Online (Sandbox Code Playgroud)

stack-overflow performance scala tail-recursion

10
推荐指数
1
解决办法
3933
查看次数

Scalacheck无法正确报告失败案例

我写了以下规范

"An IP4 address" should "belong to just one class" in {
    val addrs = for {
        a <- Gen.choose(0, 255)
        b <- Gen.choose(0, 255)
        c <- Gen.choose(0, 255)
        d <- Gen.choose(0, 255)
    } yield s"$a.$b.$c.$d"

    forAll (addrs) { ip4s =>
        var c: Int = 0
        if (IP4_ClassA.unapply(ip4s).isDefined) c = c + 1
        if (IP4_ClassB.unapply(ip4s).isDefined) c = c + 1
        if (IP4_ClassC.unapply(ip4s).isDefined) c = c + 1
        if (IP4_ClassD.unapply(ip4s).isDefined) c = c + 1
        if (IP4_ClassE.unapply(ip4s).isDefined) c = c + …
Run Code Online (Sandbox Code Playgroud)

automated-tests unit-testing scala scalatest scalacheck

9
推荐指数
1
解决办法
1235
查看次数

Scala:一次性资源模式

Scala库中是否有任何标准化来支持可支配资源模式.我的意思是类似于C#和.NET支持的东西,只提一个.

例如,官方Scala库提供的内容如下:

trait Disposable { def dispose() }

class Resource extends Disposable

using (new Resource) { r =>

}
Run Code Online (Sandbox Code Playgroud)

注意:我知道这篇文章« Scala最终阻止关闭/刷新资源 »但它似乎没有集成在标准库中

scala disposable resource-cleanup

7
推荐指数
2
解决办法
1703
查看次数

Scala API 2.10.*:Function2.andThen发生了什么?

我正在阅读Joshua Suereth写的"Scala in Depth",这本书是我为作者明确建立的能力而购买的.我在第3页,经过一堆拼写错误和不连贯的格式化(好吧,我已经容忍了这些错误)我偶然发现了以下关于解决一个非常简单的场景的功能方法的例子.

trait Cat
trait Bird
trait Catch
trait FullTummy

def catch(hunter: Cat, prey: Bird): Cat with Catch
def eat(consumer: Cat with Catch): Cat with FullTummy

val story = (catch _) andThen (eat _)
story(new Cat, new Bird)
Run Code Online (Sandbox Code Playgroud)

我谨慎地举了这个例子,前提是它显然是一个蓝图(没有具体的方法被定义......)......«catch»显然是另一个错字,前提是它是一个保留字...... Cat并且Bird不可实例化......

......但是,尽管这个例子的质量很差,但我不能认为根据功能构成定义的«故事»val(andThen是"反向关联" compose)是另一个意外的错误,前提是它是这个例子的核心.

实际上,该示例不会在我的本地版本的Scala(2.10.1)上编译,并且在最新版本(2.10.2)上也没有记录.

毫无疑问它的用处和实现很容易实现(如下):

trait Function2ex[-T1, -T2, +R] extends Function2[T1, T2, R] {
  def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) } …
Run Code Online (Sandbox Code Playgroud)

api scala function-composition

7
推荐指数
1
解决办法
613
查看次数