我试图在Scala中编写一个类似于Haskell“iterate”函数的函数。给定值x和函数f,iterate应该返回由值x,f(x),f(f(x))等组成的流......
这是我写的代码:
{{1}}
当我尝试编译它时,我收到错误:
前向引用扩展了值res的定义(第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)
}