你可以,但它不会懒惰地评估:
def bin(s: String, n: Int): Stream[String] = {
if (s.length == n) {
println("got " + s) // for figuring out when it's evaluated
Stream(s)
} else {
val s0 = s + '0'
val s1 = s + '1'
bin(s0, n) ++ bin(s1, n)
}
}
例如,在执行时bin("", 2).take(2).foreach(println)
,您将获得以下输出:
scala> bin("", 2).take(2).foreach(println)
got 00
got 01
got 10
got 11
00
01
如果您不介意使用 aTraversableView
您可以使用此处描述的转换https://stackoverflow.com/a/3816012/257449。那么代码就变成了:
def toTraversable[T]( func : (T => Unit) => Unit) = new Traversable[T] {
def foreach[X]( f : T => X) = func(f(_) : Unit)
}
def bin2(str: String, n: Int) = {
def recurse[U](s: String, f: (String) => U) {
if (s.length == n) {
println("got " + s) // for figuring out when it's evaluated
f(s)
} else {
recurse(s + '0', f)
recurse(s + '1', f)
}
}
toTraversable[String](recurse(str, _)) view
}
然后
scala> bin2("", 2).take(2).foreach(println)
got 00
00
got 01
01
got 10