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

Defining a lazy stream in Scala (translating a Racket example)

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

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

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

我试图在 Scala 中定义此函数,但无法正确输入,正在进行一些奇怪的递归:

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

此函数的正确类型是什么?

(1, ones) 只是一个元组,元组有固定的大小所以它不可能是无限的,但是你可以像 [=18= 中那样构造一个 LazyList ]racket 例子是这样的:

lazy val ones = 1 #:: ones

或者更简单:

val ones = LazyList.continually(1)

Basically this defines a function ones that returns a lambda that when called returns a tuple that the first element is 1 and the second element is the method itself.

Here we go:(不推荐,仅限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)