【发布时间】:2013-04-22 19:33:51
【问题描述】:
为什么 Scala 标准库中的某些方法以可变状态实现?
例如,find 方法作为scala.Iterator 类的一部分实现为
def find(p: A => Boolean): Option[A] = {
var res: Option[A] = None
while (res.isEmpty && hasNext) {
val e = next()
if (p(e)) res = Some(e)
}
res
}
这可以作为@tailrec'd 方法实现,可能类似于
def findNew(p: A => Boolean): Option[A] = {
@tailrec
def findRec(e: A): Option[A] = {
if (p(e)) Some(e)
else {
if (hasNext) findRec(next())
else None
}
}
if (hasNext) findRec(next())
else None
}
现在我想一个论点可能是可变状态的使用,而while 循环可能更有效,这在库代码中非常重要,这是可以理解的,但对于@tailrec'd 方法来说真的是这样吗?
【问题讨论】:
-
您的问题似乎假设如果这些方法是不可变的会更好。是这样吗?毕竟,迭代器本质上是状态引擎。
-
根据我的(不是广泛的)经验,Scala 和函数式语言通常更喜欢不变性。
-
嗯,Linq 在表面上是不可变的,但在表面下它使用
yieldreturn,它的核心是一个可变状态引擎,就像这个引擎一样。在 Haskell 中,可变性本质上隐藏在 monad 魔法之后。如果你挖掘得足够深,我怀疑你会发现无处不在的可变性。
标签: scala immutability