【问题标题】:Scala: How to avoid var hereScala:如何在这里避免 var
【发布时间】:2017-01-31 06:42:42
【问题描述】:

我有一个这样的代码 sn-p:

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
    }

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

【问题讨论】:

  • 根据定义,这个 sn-p combiner(obj) 不是 FP,因为它是一个重复采用相同参数但返回不同结果的函数。

标签: scala functional-programming immutability


【解决方案1】:

使用递归:

@tailrec
def doUntilTerm(obj: List[A]) = 
          if (terminationCond(obj)) obj.head else doUntilTerm(obj)

【讨论】:

  • if (terminationCond(obj)) obj.head else doUntilTerm(combine(obj)) 否则正确。
【解决方案2】:

我发现以下比显式递归版本更具声明性:

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

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2019-03-27
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多