gpt4 book ai didi

scala - clojure在scala中迭代等效?

转载 作者:行者123 更新时间:2023-12-04 17:37:58 24 4
gpt4 key购买 nike

递归很酷,但当你被高阶库函数包围时,它有点低级。我试图避免为依赖于最后生成的值的进程编写递归函数。

我通常会使用 iterate 在 Clojure 中通过最后一个值和当前参数的“压缩”列表运行。 Scala 的集合 API 中是否有等效的函数?

这是在一些疯狂的伪代码中尝试抽象示例:

说你有

  • 输入列表:Seq(1,2,3)
  • 您对生成的最后一个值和列表中的下一项执行的某些操作:
    lastValue ^ 2 + nextInt(i)

  • 并且您想要累积生成的所有值。

    我试图避免写类似的东西:
    def f(ls:Seq[Int]):Seq[Float] = {

    def g(pos:Int, lastGen:Float):Seq[Float] = {
    val v = gen(lastGen, ls(pos))
    if( end(v) )
    Seq(v)
    else
    Seq(v) ++ g(pos+1, v)
    }

    f(0, 1)
    }

    我在 Haskell 中定义了 Fibonacci 的惰性流版本时看到了类似的东西,所以假设我可以使用一个引用自身的惰性流,但这比 Clojure 的迭代更难让我理解。

    最佳答案

    这是你要找的吗?和 iterate 基本一样在 Clojure 中:

    List.iterate(1, 5) { _ + 1 }
    // res1: List[Int] = List(1, 2, 3, 4, 5)

    我认为 iterate的定义为 List来自 GenTraversableFactory .

    唯一的缺点是第二个参数 len是您想要的参数数量,因此它不会返回像 iterate 这样的无限序列在 Clojure 中。

    更新:

    刚学到新东西! Stream 对象有一个 iterate方法也是如此,这使您可以创建无限的惰性流:
    (Stream.iterate(1) { _ * 2 } take 5).toList
    // res1: List[Int] = List(1, 2, 4, 8, 16)

    关于scala - clojure在scala中迭代等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084424/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com