我經常遇到一個模式,所以我想知道Scala庫中是否有任何方便的方法。重複調用函數直到它返回無
讓它成爲函數f: A => Option[B]
。我想做一個f
的循環調用,從x
開始,f(f(f(x).get).get...)
開始,直到f
返回None
並保持最後一個非None
值。
我寫這個的實現:
@tailrec
def recurrentCallUntilNone[B](f: B => Option[B], x: B): B = f(x) match {
case Some(y) => recurrentCallUntilNone(f, y)
case None => x
}
難道這已經在標準庫中實現?
此用法示例可以用於保持當前位置的列表(Zipper)。通過調用next
,如果在當前位置之後沒有元素,或者Option
對於同一個列表,但當前位置遞增,則返回None
。通過使用上面的方法,可以構建一個搜索列表到最後的方法。
這不是在圖書館,而是你正確的做法。 –
加'@ tailrec'! –
這幾乎是['unfold'](http://daily-scala.blogspot.co.at/2009/09/unfoldleft-and-right.html)。但它似乎並不出現在任何庫中。 – phg