Law*_*eld 1 functional-programming scala scalaz
是否有组合现有 Scala 集合函数来实现以下目标的标准方法?或者这是否已经在一些流行的扩展库(如 Scalaz)中定义?
def partialReduceLeft[T](elements: List[T], nextReduction: List[T] => (T, List[T])): List[T] =
if (elements == Nil)
Nil
else {
val (reduction, residual) = nextReduction(elements)
if (residual.length >= elements.length)
throw new Exception("Residual collection from nextReduction function must be smaller than its input collection.")
if (residual == Nil)
List(reduction)
else
reduction :: partialReduceLeft(residual, nextReduction)
}
Run Code Online (Sandbox Code Playgroud)
该函数接受一个集合并应用一个用户定义的函数,该函数返回第一个减少,这可能消耗一个或多个元素。该方法一直持续到所有元素都被消耗掉。
结果集合的大小可能等于或小于输入集合(我相当不科学地将其称为“部分减少左”-因为想知道此类标准函数的确切术语:))。
我的实现不是尾递归的,老实说,我更愿意使用别人的代码!!
scalaz 中有类似的方法:unfold
.
您可以使用unfold
这种方式实现您的方法:
def partialReduceLeft[T](elements: List[T],
nextReduction: List[T] => (T, List[T])): Stream[T] =
unfold(elements){ es => es.nonEmpty option nextReduction(es) }
Run Code Online (Sandbox Code Playgroud)