我有一个这样的代码段:
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
}
我正在寻找一种从函数式编程样式编写此代码的方法,避免使用任何可变类型。
答案 0 :(得分:4)
使用递归:
@tailrec
def doUntilTerm(obj: List[A]) =
if (terminationCond(obj)) obj.head else doUntilTerm(obj)
答案 1 :(得分:0)
我发现以下内容比明确的递归版本更具说明性:
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
创建一个结果流,只要终止条件不成立,就会丢弃,然后返回它所执行的第一个头部。