Scala 无限迭代函数

Scala infinite iterate function

我正在尝试在 Scala 中编写一个类似于 Haskell "iterate" 函数的函数。给定值 x 和函数 f,迭代应该 return 由值 x、f(x)、f(f(x)) 等组成的 Stream...

这是我写的代码:

object current {
  def iterate[A](f: A => A, x: A): Stream[A] = {
    val res: Stream[A] = x #:: res.map(f)
    return res
  }

  def double(x: Int) = x * 2

  def main(args: Array[String]): Unit = {
    val str: Stream[Int] = iterate(double, 2)
  }
}

当我尝试编译它时,出现错误:

前向引用扩展了值 res 的定义(第 3 行)

如何更正我的代码以生成正确的流?

我假设你需要这样的东西:

def iterate[A](f: A => A, x: A): Stream[A] =  x #:: iterate(f, f(x))

但为了更好的类型推断,我会这样写:

def iterate[A](x: A)(f: A => A): Stream[A] = x #:: iterate(f(x))(f)

scala> iterate(0)(_ + 1).take(10).force
res0: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

我想这就是您要找的。

def iterate[A](f: A => A, x: A): Stream[A] = Stream.iterate[A](x)(f)

现在可以这样使用了

def double(x: Int): Int = x * 2

def main(args: Array[String]): Unit = {
  val str: Stream[Int] = iterate(double, 2).take(10)
  str.foreach(print)
}

感谢两位的回答。为了使迭代函数起作用,对我的代码进行的最小更改只是添加一个惰性关键字:

def iterate[A](f: A => A, x: A): Stream[A] = {
  lazy val res: Stream[A] = x #:: res.map(f)
  return res
}