在Scala中定义一个惰性流(翻译一个Racket示例)



我正在学习Racket(华盛顿大学Coursera上的编程语言课程(,有一个有趣的例子可以在Racket:中定义懒惰的值流

(define ones
(lambda () (cons 1 ones)))

基本上,这定义了一个函数ones,该函数返回一个lambda,该lambda在被调用时返回一个元组,第一个元素是1,第二个元素是方法本身。

我试图在Scala中定义这个函数,但无法正确键入,出现了一些奇怪的递归:

def ones = () => (1, ones) // This complains that recursive function should have types
def ones: () => (Int, ???) = () => (1, ones) // What is the type here?

这个函数的正确类型是什么?

基本上,这定义了一个函数ones,它返回一个lambda,当调用返回一个元组,其中第一个元素为1,第二个元素为元素是方法本身

我们开始:(不推荐,仅限scala 2.1(

import scala.language.existentials
type T = () => (Int, () => A) forSome { type A <: (Int, () => A) }
def ones: T = () => (1, ones)
val (i1, f1) = ones()
val (i2, f2) = f1()
val (i3, f3) = f2()
println(i1, i2, i3) // get (1, 1, 1)

好吧,(1, ones)只是一个元组,元组有固定的大小,所以它不可能是无限的,但你可以像下面的例子一样构造一个LazyList

lazy val ones = 1 #:: ones

或者更简单:

val ones = LazyList.continually(1)

最新更新