Scala:如何在这里避免使用 var
Scala: How to avoid var here
我有这样的代码片段:
def until(terminationCond: List[A]=>Boolean, combiner: List[A]=>List[A] )(obj: List[A]): A = {
var tempObj = obj
while(!terminationCond(tempObj)) {
tempObj = combiner(obj)
}
tempObj.head
}
我正在寻找一种从函数式编程风格编写这段代码的方法,避免任何可变类型。
使用递归:
@tailrec
def doUntilTerm(obj: List[A]) =
if (terminationCond(obj)) obj.head else doUntilTerm(obj)
我发现以下比显式递归版本更具声明性:
def until[A](
terminationCond: List[A] => Boolean,
combiner: List[A] => List[A]
)(obj: List[A]): A =
Stream.iterate(obj)(combiner).dropWhile(!terminationCond(_)).head.head
即我们通过迭代应用 combiner
创建一个结果流,只要终止条件不成立就丢弃,然后 return 它满足的第一个的头部。
我有这样的代码片段:
def until(terminationCond: List[A]=>Boolean, combiner: List[A]=>List[A] )(obj: List[A]): A = {
var tempObj = obj
while(!terminationCond(tempObj)) {
tempObj = combiner(obj)
}
tempObj.head
}
我正在寻找一种从函数式编程风格编写这段代码的方法,避免任何可变类型。
使用递归:
@tailrec
def doUntilTerm(obj: List[A]) =
if (terminationCond(obj)) obj.head else doUntilTerm(obj)
我发现以下比显式递归版本更具声明性:
def until[A](
terminationCond: List[A] => Boolean,
combiner: List[A] => List[A]
)(obj: List[A]): A =
Stream.iterate(obj)(combiner).dropWhile(!terminationCond(_)).head.head
即我们通过迭代应用 combiner
创建一个结果流,只要终止条件不成立就丢弃,然后 return 它满足的第一个的头部。