今回は数学の話になります。いきなり半群とかモノイドいう概念が登場しました。ここで、関数型プログラミングの本質とは何か?というのを改めて考えてみたいと思います。
関数型プログラミングというのは、本質的に数学の概念をプログラミングの世界で利用するための方法論だと私は思っています。元々コンピュータは計算機であって数学の概念を扱うものでしたが、従来のプログラミング言語ではそこまで高度な仕組みが整っていなかったので高度な数学の概念をそのまま落とし込むことが難しいという背景がありました。関数型プログラミングでやっと数学の概念をプログラミングの世界に持ち込むことが出来ます。(それでも、純粋数学の概念と関数型プログラミングの世界には隔たりがあるとの主張もありますが、ぶっちゃけ技術として利用するのにそこまでの厳密さは不要なので、聞かなかったことにしておきましょう)
逆に言えば、数学的な概念を使ってプログラムを構築する必要が無い、もしくは数学的な概念を使いたくないのであれば関数型プログラミングもそこまで深く掘り下げる必要は無いのかもしれません。が、知は力なりとも言いますし、とりあえず勉強してみましょう。
半群(Semigroup)
集合に二項演算
が定義されていて、
が
の全ての元
に対して以下の条件を満たすときに、組
を半群と言います。
以上は結合法則です。具体例としては、整数の足し算がそれに当たります。
厳密に言えば、正の整数の集合と加算+の組
が半群になります。正の整数の集合は半群ではないですし、加算も半群ではありません。正の整数の集合
と加算
の組
が半群です。ここをしっかりと押さえておくと後々の理解が進みやすいかもしれません。
モノイド(Monoid)
半群に単位元が付くとモノイドになります。
集合に二項演算
が定義されていて、組
が
の全ての元
に対して以下の条件を満たすときに、組
をモノイドと言います。
なる単位元
が存在する
正の整数と0からなる集合における加算はモノイドになります。単位元は0です。
その他、群、体、環などの概念もあり、いずれも使用する機会があるのですが、本記事全体でここまで進めるかどうかはまだ決めていませんのでとりあえず保留にしておきます。次回はモノイドを実装してみます。