在 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)
我正在学习 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)