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
}
我正在尝试在 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
}