是否有一种标准方法可以结合现有的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)
}
该函数接受一个集合并应用一个用户定义的函数,该函数返回第一个缩减,这可能会消耗一个或多个元素。该方法一直持续到所有元素都被消耗为止。
结果集合可能与输入集合的大小相等或更小(我相当不科学地称之为'部分减少' - 因为不知道这种类型的标准函数的确切术语:))。
我的实现不是尾递归,说实话,我宁愿使用别人的代码!!
答案 0 :(得分:4)
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) }