Scala中是否存在“部分缩减”功能?

时间:2014-02-21 17:28:53

标签: scala functional-programming 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)
  }

该函数接受一个集合并应用一个用户定义的函数,该函数返回第一个缩减,这可能会消耗一个或多个元素。该方法一直持续到所有元素都被消耗为止。

结果集合可能与输入集合的大小相等或更小(我相当不科学地称之为'部分减少' - 因为不知道这种类型的标准函数的确切术语:))。

我的实现不是尾递归,说实话,我宁愿使用别人的代码!!

1 个答案:

答案 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) }