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