[英]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.