C++のtemplateはやっぱすごいや

in

「プログラミング原論」第三章のお題でフォボナッチ数列をやったんですけど、Project Eulerでもやったなぁって思い出して探してみたらProblem25で使ってました。そのとき書いたのが、

fib :: [Integer]
fib = 0:1:(zipWith (+) fib (tail fib))

たったの2行のコレ。

前回のエントリで、うんうん言いながらC++をHaskellで書き直したpower_fib_accumulateとかpower_fibって何だったの?ってくらいのシンプルさ。Haskellのウリのひとつに"簡潔な実装が可能"っていうのよく見かけますけどホントですね。

その一方で、C++で書いたpower_accumulateとかpowerなんてのは汎用でこの章でやったようにオペランドの型を選びません。intだろうがpairだろうがpower_accumulateやpowerを使うことができます。Haskellでは(先のコードのように2行で済むなら最初からpower_accumulateやpowerを書き直してまで使う必要はないんですが)タプルの二項演算を受け付けるように書き直す必要がありました。厳密な型がじゃまをします。

どちらがどうと言うことはないんですが、第三章までをとおしてC++のテンプレートの強力さを見せつけられ(まぁ、著者がAlexander Stepnovですから...)改めてC++(with STL,Boost,Loki...)ってスゲーなって思い知らされました。

一番長いこと触れている言語だけどこのところHaskellばかり勉強していて疎遠になっているのでC++で書く仕事でも探してみるかというちょっとシアワセな気分。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/390

Comments