【问题标题】:foldRight on infinite lazy structurefoldRight 在无限惰性结构上
【发布时间】:2011-12-11 10:36:50
【问题描述】:

根据http://en.wikipedia.org/wiki/Fold_(higher-order_function),如果不需要评估完整列表,则右折叠可以对无限列表进行操作。这可以在 haskell 中看到:

Prelude> take 5 (foldr (:) [] [1 ..])
[1,2,3,4,5]

这在 scala 中似乎不太适用于流:

Stream.from(1).foldRight(Stream.empty[Int])( (i, s) => i #:: s).take(5)
// StackOverflowError

或在迭代器上:

Iterator.from(1).foldRight(Iterator.empty: Iterator[Int]){ (i, it) => 
  Iterator.single(i) ++ it
}.take(5)
// OutOfMemoryError: Java heap space

有没有一种实用的解决方案可以在 Scala 中实现惰性折叠?

【问题讨论】:

    标签: scala fold


    【解决方案1】:

    This article 进行了同样的观察,并提出了使用 scalaz 的惰性解决方案。感谢作者和 Tony Morris。

    【讨论】:

    • 谢谢。我可以使用scalaz。它适用于Stream。迭代器似乎更棘手......
    • 这篇文章根本不建议使用 scalaz,而是给出了一个纯 scala 的解决方案,据说是受到 scalaz 实现的启发:def foldr[A, B]( combine: (A, =>B) => B, base: B )(xs: Stream[A]): B = if (xs.isEmpty) base else combine(xs.head, foldr(combine, base)(xs.tail))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多