圏論と型システムとサイバネティクス 〜圏論とサイバネティクス①〜
オブジェクト指向プログラミングの大事なところは関数型でもできるらしい
オブジェクト指向はアランケイが考えたより煩雑になったのでは
以前以下のような記事を書きましたが、入力値の集合から出力値の集合への写像の集合と入力値の集合と出力値の集合をうまいことまとめるのに、本当にオブジェクト指向プログラミングで培われたデザインパターンの数々や様々な規則は必要なのでしょうか?
正直減らせそうな気がしてます。カギは圏論と型システムの気がしてますが、実装としては関数型プログラミングに収まるではないかと。
圏論なのかサイバネティクスなのか、いやその両方か
前節でぺたぺた張ったリンクの記事に書きましたが、内容が今読むと勉強不足でたどたどしいなという感じで恥ずかしいですが、オブジェクトとクラスが数学的にどうなるかというのが全然うまく捉えきれてなくて、結局ふわふわした記事になってます。
以前書いた記事内でのクラスやオブジェクトは今考えると群的なものというより圏論でいうところの圏と捉えた方が全然いいですね。公開メソッドを関手と考えればオブジェクト間のメッセージパッシングが関手によって表現されます。多くの圏と関手のl組み合わせでオブジェクト間のネットワークの表現ができます。プロジェクト全体のオブジェクト同士の関係を可換図式で表せますが、可換図式の様はまるでネットワークです。
ネットワーク上でのフィードバック現象はまるでサイバネティクスです。見出しの通りオブジェクト指向の概念は圏論でもサイバネティクスとしても表現できるのです。
そして圏論で表現できるというのは関数型プログラミングでも表現できるということです。かなり簡略で厳密さはないですが、現代プログラミングの大方の人の合意がなされた考え方になります。なのでマルチパラダイムといって関数型でもオブジェクト指向でもある言語が作れるというわけです。
型システム
タイトルにあるうちの二つはもう出てきましたが、次に残りの型システムについて話したいと思います、と言いたいですが本当に方システムは難しいので、以下におすすめの本を紹介します。ただ本当難しい。またその下に簡単に型システムについて書いていきます。
型システムはラッセルの型理論から続く正当な理論です。そもそもラッセルの型理論、階梯理論とも言いますが、命題の適切さを保つために命題の述語に適用できる変数を型理論の考えにそって分類わけして適用できない変数を除外して命題の安全性を保ちます。
命題の安全性とは例えば算数の命題で
$${1+1=2}$$
みたいな命題で変数が一と一ではなくて愛と正義みたいな数字以外のものを変数で扱えないようにして命題の真偽がつくようになっていることです。
そして型システムとはその後さらに型理論を発展させ、いろいろ応用できるようにしたのが型システムです。まあ型システムではなく昔のまま型理論とも言います。
概要はこんな感じですが、プログラミングをやったことある人は似たようなものを聞いたことがあると思います。そう、変数の型です。javaなどの静的な型の言語はint型やstring型などに変数を分類してますね。まさにプログラミング言語に型システムは応用されています。
いや型がないプログラミング言語なんでないだろうと思った方は、シェル芸の勉強をおすすめします。また昔のFortranなども型がない言語になります。
ここまでの型の説明を聞けばわかるように型は便利ですので、今では型のない言語が使われることがすくなくなりました。
今回は概要だけで次回に
noteがよく読まれる文字数が2000文字程度らしいので、この辺で一旦次回にしたいと思います。次回はプログラミング言語の変数の型をもう少し詳しく説明して型理論、型システムを具体的に解説して、型システムとラムダ計算の組み合わせが関数型プログラミングが同型なのを説明したいと思います。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?