Scala 中是否有“部分减少”功能?

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)

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

结果集合的大小可能等于或小于输入集合(我相当不科学地将其称为“部分减少左”-因为想知道此类标准函数的确切术语:))。

我的实现不是尾递归的,老实说,我更愿意使用别人的代码!!

sen*_*nia 5

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)