Scala使用可变变量来实现其apis

Muh*_*edy 7 api recursion scala tail-recursion

我正在通过Coursera课程(progfun)学习Scala.

我们正在学习如何在功能上思考并在可能的情况下使用尾递归来实现函数/方法.

作为foreach on list函数的一个例子,我们已经教会实现它,如:

def foreach[T](list: List[T], f: [T] => Unit) {
    if (!list.isEmpty) foreach(list.tail) else f(list.head)
}
Run Code Online (Sandbox Code Playgroud)

当我在一些Scala apis中发现以下实现时,我感到很惊讶:

override /*IterableLike*/
  def foreach[B](f: A => B) {
    var these = this
    while (!these.isEmpty) {
      f(these.head)
      these = these.tail
    }
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我们学会使用递归并避免使用可变变量而api正在通过相反的技术实现?

看看scala.collection.LinearSeqOptimized哪里scala.collection.immutable.List延伸.(类类本身中的类似实现)

Dan*_*sky 4

不要忘记 Scala 旨在成为一种多范式语言。出于教育目的,了解如何读取和编写尾调用递归函数是很有好处的。但在日常使用该语言时,重要的是要记住它不是纯粹的函数式编程。

库的一部分可能早于 TCO 和@tailrec注释。您必须查看提交历史才能找到答案。

该实现foreach可能使用可变变量,但从外部来看,它似乎是纯粹的。最终,这正是 TCO 在幕后所做的事情。