在许多网络文章中,函数式编程被描述为避免各种变量重新分配,因此至少只推广“最终”变量,尤其是为了更好地阅读。
它们中的大多数都是以计数器变量递增的不良循环为例。(就像著名的i++
or x = x + 1
。这里有一篇 Bob 叔叔的文章说明了它:FP Episode 1
因此,这些文章表明,依赖可变变量通常会导致副作用,尤其是会阻止我们所谓的“引用透明”,因此更难构建在多线程或更好的多处理器上运行的程序。
我的问题是:众所周知,i++
通常是线程本地变量,因此即使并发处理也不会出现问题。
为什么要选择像带有局部变量的循环这样的例子作为赋值的缺点,并允许直接得出并发编程有风险的结论?这两件事都与我完全无关。
为什么不呢,为了更清楚,选择全局变量(或字段对象)的重新分配,这显然enemy
是并发编程的一种,而不会像 Java 那样过度使用所有的锁样板。
我真的认为这个循环示例并不是将函数式编程的好处传递给命令式程序员的最佳例证。
此外,它会导致与“noob”函数式程序员的混淆,因为 Scala 例如在List
.scala 类中使用了很多 while 循环模式:
override def take(n: Int): List[A] = {
val b = new ListBuffer[A]
var i = 0
var these = this
while (!these.isEmpty && i < n) {
i += 1 // reassignment here
b += these.head
these = these.tail
}
if (these.isEmpty) this
else b.toList
}