フィボナッチ数列ですね。これは無限に続くフィボナッチ数列を作る問題です。Pythonなら
def fib(): a, b = 0, 1 while True: yield b a, b = b, a + b
Haskellなら
fib = 1:1:[ a + b | (a, b) <- zip fib (tail fib) ]
Scalaには2種類の無限列があるようです。
Iterator
IteratorはPythonのそれと同じく列の実体は持たないで値を生成していく機構です。ただ、上のPythonのgeneratorのようなお手軽な書き方はできず、Iteratorクラスを継承しなければなりません。
class Fib extends Iterator[Int] { var (a, b) = (1, 0) def hasNext() = true def next() = { val tmp = a a = b b = tmp + b b } } val N = 4000000 println ((new Fib) takeWhile((n) => (n < N)) filter((n) => n % 2 == 0) sum)
このように、hasNextとnextをオーバーライドします。
2つの変数の初期化はできるんですが、
var (a, b) = (1, 0)
こういう代入はできないんですね。
(a, b) = (b, a + b)
メソッドの構文
println ((new Fib) takeWhile((n) => (n < N)) filter((n) => n % 2 == 0) sum)
takeWhileはほかの関数型言語と同じです。
takeWhileの前にスペースがありますが、ここはドット(.)でも同じことです。