Posted at

オブジェクト指向言語で、関数型プログラミングに慣れたい人向けの「圏論アレルギー処方箋」


はじめに

本記事は、オブジェクト指向をざっくり理解している人向けに書きます。


オブジェクト?

そもそも、オブジェクトの捉え方ですが…

それは圏論の言葉で言うと「圏」であり…


それ難しいから(笑)

そもそもから話そうではないか我が友よ(笑)

そもそも数学嫌いが多いじゃないか

重要なのは対話じゃないか


アレルギーの方へ…

例えば、1+1=2 という数式で説明します。

実は、証明できます

しかし、そんな事をしなくても自明の理(当たり前)です。

この、ある値がとり得る当たり前の図式 を結論だけ言って整理すると…

(間はめちゃくちゃ長いです)

1に1を足すと2になるというメソッドで切り出せるということになります。

(すごく乱暴です。)

こういう、当たり前の図式 の事を、自然変換という名前で読んでいるだけです。

で、それを、分かりやすい言い方に変えるとメソッドになります。

分かりづらいなら、

x+y=z

xにyを足す z になる

という動詞だということに着目してください。

これを普段のオブジェクト指向から説明すると、

オブジェクトAをupdateするAの各プロパティは B になる

つまりは、メソッドはオブジェクトが持つ自明の理を実装しているに過ぎません。


メソッドが自然変換だと考えたら出来ること

ここもゴニョっと言えますが…

乱暴に片付けてしまうと、オブジェクトが持っているプロパティが、ある値になる。

それは、~~~~~~の理由で…

という風に記述しますよね。

つまり、あまりにも長いメソッドは、リファクタリングをします。

細かい記述に書き直せるというわけです。

このリファクタリングされたメソッドは、もしかすると

オブジェクトが持っている値を直接書き換えない場合が多いのではないでしょうか?

ところが、リファクタリングしても、切り出したメソッドの再利用価値が低いなどということも考えられます。


メソッドの分解 = 自然変換の分解

あるメソッドは、リストをイテレート(巡回)した結果を返すとします。

イテレートの際は、必ず幾つかの約束を果たさねばなりません。

よくある設計ですよね?

そこで、意気揚々とリファクタリングします。

実は、リファクタリングは、自然変換の分解です。

分解すると、より小さなメソッド(つまり関数)に切り出せます。

そういった概念を、「圏論」の言葉でいうと「関手」、「射」と読んでいるだけです。

つまり、関数型プログラミングの最初の理解に大切なことは。


メソッド内だけで、関数型プログラミングをする

本当にミクロな書き方が出来ると思います。

そういうところで便利さが分かってくると面白くなってきますので、

怖がらずにまずは

ラムダ(無名関数)

を使った表現に変えてみることから、初めてみてください。