Haskellでフィボナッチ数列を書く

JavaScriptやってると、「どうやら関数型言語の影響を受けているらしい」と聞くことがある。まあ、functionとか書きまくってるのに関数型言語のこと知らないのも何なので、ちょっと始めてみることにした。

読んでいる本はこれ。

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門


なんかRuby界隈でよく使われてるような気がするのでHaskellにした。仲間入り。

さっそくフィボナッチ数列を書いてみる。

main = do print $ map fib [1, 2 .. 10]

-- フィボナッチ数列の第n番目の値を返す
fib :: Integer -> Integer
fib 1 = 1
fib 2 = 1
fib n = fib (n - 1) + fib (n - 2)

実行結果はこれ。

[1,1,2,3,5,8,13,21,34,55]

うん、ちゃんとできてる。

ちなみに、こんな書き方でもOK。

main = do print $ take 10 $ map fib [1 ..]

-- フィボナッチ数列の第n番目の値を返す
-- ここから下はさっきと一緒
fib :: Integer -> Integer
fib 1 = 1
fib 2 = 1
fib n = fib (n - 1) + fib (n - 2)

map fib [1 ..]で「無限に続くフィボナッチ数列」を作って、take 10でその先頭10個を取り出している。こういうのがHaskellっぽい(って本に書いてあった)。