Haskell でたらいまわし関数

まだ Haskell は全然わかりませんが、Haskell では「たらいまわし関数」がすごいということなのでやってみました。「たらいまわし関数」については、このブログにも簡単な記事があって、Ruby などでやってみております。簡単にいうと、これは関数呼び出しのベンチマークに使われる関数です。竹内関数とも呼ばれます。


で、Haskell のコードです。面倒な部分(つまり入出力)ははしょって、超初心者らしく書いております(他人のコードを参考にして、というかもろパクっています)。

tarai :: Int -> Int -> Int -> Int
tarai x y z
    | x <= y    = y
    | otherwise = tarai
                    (tarai (x - 1) y z)
                    (tarai (y - 1) z x)
                    (tarai (z - 1) x y)
                    
main = putStrLn $ show $ tarai 12 6 0

 
実行結果。

$ ghc tarai.hs
$ time ./tarai
12

real	0m0.003s
user	0m0.000s
sys	0m0.000s

なんというか…、言葉も出ません。

これはどういうことかというのですが、何なんでしょうね。詳しくは
で色いろ調べられております(自分にはよくわかりませんが)。遅延評価のためということなのでしょう。カリー化は? これも自分にはよくわかりませんが、もちろん関係しているのでしょうな。たらいまわし関数に関しては Haskell 最強という話であります。


※追記
インタプリタでやっても速いので、これはやはり遅延評価自体の威力なんだろうなあ。

$ time runghc tarai.hs
12

real	0m0.192s
user	0m0.148s
sys	0m0.036s