2016-09-22 58 views
1

我有一段代碼是這樣的:斯卡拉:如何避免VAR這裏

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

這段代碼'combiner(obj)'根據定義不是FP,因爲它是一個重複使用相同參數但返回不同結果的函數。 – jwvh

回答

4

使用遞歸:

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

if(terminationCond(obj))obj.head else doUntilTerm(combine(obj)) 否則是正確的。 – Iadams

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創建一連串的結果,只要終止條件不成立,然後返回它所做的第一個頭。