読者です 読者をやめる 読者になる 読者になる

パスカルの三角形とリスト操作

先日の Ruby 勉強会@関西の Enumerable の演習ネタが パスカルの三角形 - rubyco(るびこ)の日記 をみんなで作ってみよう、だったのですが、せっかく Enumerable をやっておきながら、combination なんて再帰関数を作るのは少々残念です。

というわけで、map などのリスト操作を使ってパスカルの三角形を作りつつ、なぜか ruby の Enumerable では、collect の別名として map が用意されているのに、find_all や select といった "filter" 関数に filter という別名がついておらず、inject の正体が "foldl" であることを知り、混乱していた、というネタを書こうと思ったのですが、時間が無さすぎです(涙)。

collect や select, inject は Smalltalk のメソッドセットらしいのですが、これをいかにも耳慣れていない様子がお里を語ってますね……。

ところで、map, filter, foldl, foldr というセットは、いまや Haskell や Clean で有名(?)ですが、そもそもは Lisp 由来かと思っております。しかし、もっと元ネタがあるんでしょうか。

何を言いたかったかといいますと、リストを基本的なデータ構造とみなし、そのリストに対する操作で全体の処理を行おう、という思想があります。これは、for 文で要素をひとつずつ処理するという逐次的な発想とは似て非なるものです。リスト全体をひとつの処理単位とみなして、その全体に処理を施していくという発想は、一種独特なものがあります。使いこなせるようになれば、とても強力なものですが、複雑になってくるとなかなか頭の訓練が必要になりますね(^^;

しかし、Ruby や Python や JavaScript 使いにとっては連想配列が手足のように使えるプリミティブなデータ構造であるように、Lisp や ML 使いにとってはリストは非常に柔軟なプリミティブなデータ構造なのです。

そして、もしかしたらまだ見つけていないだけで、もっと他の柔軟で強力なデータ構造が思わぬところに転がっているのかもしれませんね。凡人の発想では XML の木構造をネイティブに扱える言語とか、RDB をネイティブに扱える言語とか、ありがちなものしか思い浮かべられませんけど。