我正在试验Kotlin序列,特别是那些不是前一个值的简单计算的更复杂的序列.
我想定义的一个例子是所有素数的序列.
定义下一个素数的一种简单方法是下一个整数,它不能被序列中任何先前的素数整除.
在Scala中,这可以转换为:
def primeStream(s: Stream[Int]): Stream[Int] = s.head #:: primeStream(s.tail filter(_ % s.head != 0))
val primes = primeStream(Stream.from(2))
// first 20 primes
primes.take(20).toList
Run Code Online (Sandbox Code Playgroud)
我无法将其翻译成Kotlin.在scala中它可以工作,因为你可以传递返回一个将被懒惰评估的序列的函数,但我不能在Kotlin中做同样的事情.
在Kotlin,我试过了
fun primes(seq: Sequence<Int>):Sequence<Int> = sequenceOf(seq.first()) + primes(seq.drop(1).filter {it % seq.first() != 0})
val primes = primes(sequence(2) {it + 1})
primes.take(20).toList()
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用,因为函数被立即评估并导致无限递归.
kotlin ×1