ScalaでProject Euler(4)

Problem 2

フィボナッチ数列ですね。これは無限に続くフィボナッチ数列を作る問題です。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

IteratorPythonのそれと同じく列の実体は持たないで値を生成していく機構です。ただ、上の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の前にスペースがありますが、ここはドット(.)でも同じことです。