1

我在 Scala 库的 List.scala 中看到了以下实现:

override final def forall(p: A => Boolean): Boolean = {
    var these: List[A] = this
    while (!these.isEmpty) {
      if (!p(these.head)) return false
      these = these.tail
    }
    true
  }

该方法可以递归实现以摆脱 var 和 while 循环。通过在线阅读所有可用的书籍、博客、文章等,我的印象是我们应该在 Scala 中尽可能多地遵循递归方法。

4

2 回答 2

2

的可变性在方法var these外部不可见forall,可能有助于提高性能

override final def forall(p: A => Boolean): Boolean = {
  var these: List[A] = this
  ...
  true
} // var is out-of-scope at this point

所以从调用者的角度来看,技术上forall仍然是纯粹的。递归方法也可能具有与 var+while 相似的性能。

于 2021-09-01T14:19:24.550 回答
0

递归方法被认为更具声明性和可读性,这就是为什么它是一种好方法。从另一方面来看,函数式方法尤其意味着不可变性,这可能会导致性能下降,因此在 Scala 库中使用这种方法是可以理解的。我假设 Scala 库的作者没有假设用户大量阅读他们的代码,因为它应该在引擎盖下。

于 2021-09-01T14:05:31.157 回答