言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

関数型プログラミングに何を期待しているのか。

阿部さんに、何で僕が一人で関数関数言ってるのか全然分からないと言われたので、寝る前に書く。だけど今日中に纏めるのは無理なので下書き。

プログラミングというのは、パソコンに何をやって欲しいかを伝えるという役割と、自分が何をやりたいのか纏める役割と、両方あると思う。特に自分が何をやりたいのか纏めるというのは大切で、プログラムを書く事によって今まで何て自分は浅はかな事を考えていたのだろうと何度も気づかされた。

で、なぜプログラミングによって考え方が纏まるかというと、プログラミングには考えを纏めるための色んな仕組みが用意されているから。サブルーチンだったり構造体だったりオブジェクトだったり。そういうのを使って、色んなアイデア同士の関係をじっくり見たり、壊れていた部分を探したり、意外と共通していた物を見つけたり、プログラムとアイデアが同時に整理されてくる。これがプログラミングで一番大切な部分。

そこまで行くと、あともう一歩コンピュータが助けてくれたら良いのにと思うことが良くある。最初は単純だったアイデアも、色々な条件や他の要素が加わってくるとどんどんややこしくなる。ややこしくなると修正が大変になってくる。ここで、プログラムの意味を変えないで表現を事が出来れば、安心して修正しながらプログラムを別の角度から眺める事が出来る。リファクタリングと呼ばれるテクニックだ。僕が関数型プログラミングに期待しているのは、結局無茶苦茶すごいリファクタリング機能だ。

意味を変えないで表現を変えるというのは、数学の仕事だ、1 + 1 = 2 というのは、1 + 1 という表現と、2 という表現の意味が同じだという事を指している。数学の仕事は意味を保ったまま式を変形する事だから、ここできっと 1 や 2 だけじゃなくてプログラムの変形も数学で出来るんじゃないかと思う。そして、関数型プログラミングではそういう事が出来る。

プログラムを書いていくと、沢山の絡まったコードが、実はほんの単純な事実しか表現していなかったという事に気づく事がよくある。部分と全体を同時に考える事は難しいから、部分を熱心に作っていると全体の構造を忘れてしまいがちだ。そういう時に、絡まったコードをコンピュータが勝手に直してくれれば良いのに。関数型プログラミングではそういう事が出来る。

これがどんなにスゴイ事か!機械語をサブルーチンによって意味の塊に分ける事が最初の革命だとすると、意味の塊をコンピュータの力を借りて操作するというのは次の革命だ。サブルーチンを何重にもネスト出来るように、意味の塊の操作もまた何重にもネスト出来る。今まで本質的に複雑だと思っていた物も単純な構造に分解できるようになるだろう。そして何よりも面白いのは、それが遠い三十年前に起こった事では無くて、今起こっているという事だ。