ScalaでProject Euler(5)

Problem 2

Stream

Iterableをつかったフィボナッチ数列はイケてなかったですが、もう一つHaskellと同じような無限列を生成する方法があります。それがStreamです。次はPythonのcountと同じように1ずつ増える無限列を生成するメソッドの例です。

def count(n :Int = 0) :Stream[Int] = Stream.cons(n, count(n + 1))

Streamは列の実体を保持しながら生成していくようです(本当に保持するかはたぶんまた別の話)。Stream.consはStreamの列の前に要素を加えるメソッドです。これでHaskellと同じようにフィボナッチ数列を生成することができます。

val fib : Stream[Int] = Stream.cons(1, Stream.cons(1,
                        fib.zip(fib.tail).map((f) => f._1 + f._2)))

zipですらメソッドなんですねえ。オブジェクトと引数は対等なのに。
しかし、Stream.consが続くのはちょっとみっともないですね。

import Stream.cons

val fib : Stream[Int] = cons(1, cons(1,
                        fib.zip(fib.tail).map((f) => f._1 + f._2)))

これなら使えるでしょうか。

タプル

タプルfのn番目の要素は、f._nでアクセスできます。