関数型言語のモナド (1)
関数型言語のモナド に関する記事はインターネット上に大変多くありますが、この記事は 短時間で理解する ということに重点をおいています。
全部で9章の構成で、全てを理解するには1日程度はかかるかもしれません。それでも、インターネット上に散らばる記事を読むよりも効率的になるよう短くまとめていますので、どうぞご一読よろしくお願い致します。
私はあるときモナドという言葉に関心を持ったのですが、関数型言語を仕事で使っていないため、最初は本腰を入れて調べませんでした。
ときどき、モナドのことを思い出して調べてみる、ということを繰り返していましたが、「インターネット上にあるたくさんの記事」を読んでみても理解できたという気分にならず、時間を無駄にした気分になっていました。
時間に余裕があったある日、関数型言語である Haskell でモナドを試しに利用してみたところ、関数型言語におけるモナドの利用法は簡単 であると理解できたのです。
もう少し詳しく言うと、モナドの利用法は簡単なのですが、その応用範囲が非常に広く、様々な場面でモナドを適用させる方法がたくさんあるため難しい、ということが分かりました。
私と同様に、関数型言語におけるモナドを理解したいという人は多いのだと思います。 知りたい人が多いからこそ、インターネット上にあれほど多くの記事があるのでしょう。
もし、モナドについて短時間で理解できる記事があったらとても助かったのにな、という思いからこの記事を書くことにしました。
インターネット上にある記事を読んでみても、なぜなかなか理解できなかったのか、それは以下の2つの理由によるものだと思います。
「モナド」という言葉が数学の圏論からもらってきた言葉であるため、圏論に関する用語を重点的に解説している記事が多い。
モナドは関数型言語においてその概念を活用できるものであるのに、javascript などの言語を用いて解説し、「flatMap がモナドである」というような解説をしている記事が多い。
1. について
プログラムを組むときに「関数」という言葉をよく使うと思います。「関数」は数学からもらってきた言葉ですが、数学における定義はおおよそ以下のようなものらしいです。
プログラムを組むときに上のような定義はあまり役に立たないため、プログラムの解説記事で、関数を上記のように紹介しているものはないと思います。
しかし、モナドについては、プログラムにおけるモナドを解説しているものであるはずなのに、「圏」や「関手」などについて詳しく解説している記事が多いのです。
「圏」、「関手」などの言葉が面白そうに思えるのは分かりますが、「関数」という言葉の定義を詳しく理解してもプログラムにはあまり役立たないのと同様に、それらの言葉の詳細な定義もやはりプログラムにはあまり役立ちません。
2. について
モナドを javascript の配列を用いて解説している記事が多くあり、 また、配列を用いたサンプルコードを掲載して解説しているものがたくさん見受けられます。
サンプルコードは理解できてしまうために、モナドって配列みたいなものか、と思ってしまうところがワナであると思います。 サンプルコードが分かるから、また他の記事を読んで、さらに理解を深めよう、などと思ってしまうのですが、 これがワナなのです。
配列に対する操作に対して、わざわざ「モナド」という名前を付けるわけがありません。 モナドを配列で理解しようとするのはやめましょう。 理解するまでに余計な時間が掛かってしまうだけのことになりますので。
関数型言語を用いずにモナドを理解するのは困難であると思います。
今後の方針
私は 正攻法で関数型言語の Haskell を用いて短時間でモナドを理解する、という方針をとります。
Haskell の文法をまったく知らない、という前提で解説を進めますので安心してください。
Haskell は難しいと言われますが、モナドを理解するためだけならば簡単です。 モナドに近付くことに関する文法のみを理解すればいいだけですので。
それでは、モナドを理解する一歩を進めましょう!