Scala:如何避免var

时间:2016-09-22 15:33:56

标签: scala functional-programming immutability

我有一个这样的代码段:

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
    }

我正在寻找一种从函数式编程样式编写此代码的方法,避免使用任何可变类型。

2 个答案:

答案 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创建一个结果流,只要终止条件不成立,就会丢弃,然后返回它所执行的第一个头部。