繁体   English   中英

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

[英]Is there a 'partial reduce' function in Scala?

是否有将现有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)
  }

该函数接受一个集合,并应用一个用户定义的函数,该函数返回第一个约简,这可能会消耗一个或多个元素。 该方法一直进行到所有元素消耗完为止。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM