2013-02-01
tailをなくしたフィボナッチ数列
以下の内容は比較的どうでもいいことなので、暇な人だけ読んで下さい。
Haskell では、head と tail という関数は使うなと言われる。なぜなら、引数が空リストのときにエラーを返すからである。純粋な関数は全域関数であるべきだが、head と tail は div などと共に、この規律から逸脱している。
コーディング規約として、head や tail を禁止している組織もあるようだ。僕は、絶対に空リストでないことが保証されるところなら、まぁ、head や tail は使ってもいいかなと思う。
head や tail が、ある意味 Haskell の恥であるにも関わらず、以下のフィボナッチ数列のコードは、盛んに引用される。
fibs :: [Integer] fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
tail 不要論派の Haskeller なら、このコードは許せないだろう。しかし、tail を取り除けない人がほとんどではないか?
関数の引数として書く変数名には、@パターンが使えることは、Haskeller のほとんどが知っているだろう。実は、トップレベルの変数名にも@パターンが利用できる。だから、tail を取り除いて、以下のようなコードが書ける。
fibs,fibs' :: [Integer] fibs@(_:fibs') = 0 : 1 : zipWith (+) fibs fibs'
分かりやすくなったのか、分かりにくくなったのか、微妙な感じではあるけれど。
追記
「二番目のコードは、パターンマッチがあるので許せない!」という方には、中野さんが書いたこのコードをどうぞ。
fibs,fibs' :: [Integer] fibs = 0 : fibs' fibs' = 1 : zipWith (+) fibs fibs'
あわせて読みたい
トラックバック - http://d.hatena.ne.jp/kazu-yamamoto/20130201/1359703111
リンク元
- 179 https://www.google.co.jp/
- 49 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDUQFjAA&url=http://d.hatena.ne.jp/kazu-yamamoto/20080722/1216734420&ei=cG0LUZWdIcnFkQWl1IGoDA&usg=AFQjCNHIyPJPqcPb8cr3WwNFtbQJ1Gu6gQ&sig2=Qg6EmE3LHxLX2rf1EyLVnQ&bvm=bv.4186
- 44 http://t.co/DqcWpX1A
- 39 http://developers.slashdot.jp/story/13/02/05/0255214/関数型言語を採用するプロジェクトが増加、果た?%
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CD8QFjAB&url=http://d.hatena.ne.jp/kazu-yamamoto/20080208/1202456329&ei=y4cLUZqzOYepkAXj44DwBA&usg=AFQjCNHhpYIq2I026lfp3eg544Xhg9INIg&sig2=3Tk6kCgukICZbdNS8L3esg&bvm=bv.4186
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CEQQFjAC&url=http://d.hatena.ne.jp/kazu-yamamoto/20080118/1200625877&ei=xIMLUYvbH-P2mAW-rIHIAQ&usg=AFQjCNFMtovNRibP9JJKCKPF8ZQgUY4CFw&sig2=uCdlSINmtz3XjVCiy8ZKxA&bvm=bv.4186
- 22 http://developers.slashdot.jp/story/13/02/05/0255214/
- 21 http://reader.livedoor.com/reader/
- 21 https://www.google.com/
- 18 http://www.mew.org/~kazu/

