Scala无限迭代函数

时间:2016-10-21 20:12:13

标签: scala recursion lazy-evaluation

我试图在Scala中编写一个类似于Haskell“iterate”函数的函数。给定值x和函数f,iterate应该返回由值x,f(x),f(f(x))等组成的流......

这是我写的代码:

{{1}}

当我尝试编译它时,我收到错误:

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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

感谢两个答案。我的迭代函数代码的最小变化就是添加一个惰性关键字:

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

答案 2 :(得分:1)

我认为这就是你要找的东西。

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