この記事について
この記事の対象読者
- 抽象化能力を高めたい人。
- 圏論とHuskellを理解してみたい人。
- 理解力を高めてみた人。
この記事から得られること
- 次に来る可能性のある技術を先行キャッチアップできる。
- 自分の能力を戦略的に収益に変えて資産形成を有利に進める。
まえがき
プログラミングの規模が大きくなってくると抽象化が重要になってくる。異なる処理の間に共通する部分を見つけること(抽象化)によってプログラムの可読性や品質を大きく向上できる。その抽象化を扱うときに、数学をさらに抽象化したような学問である「圏論」という学問にたどり着く。そして、その圏論を応用したプログラミング言語がHaskellである。
Haskellとは?
ハスケルと読む。アメリカの数学者 Haskell Curry(1900-1982)の名に由来。1990 年に発表された純粋関数型言語。C言語に代表される手続き型言語では、変数の値(すなわち状態)を更新しながら逐次的に手続きが実行されていく(⇨状態更新に遅延がある)。 一方、純粋関数型言語では変数(状態)が存在せず、全ての関数が副作用を持たない。この状態を持たないという特性のおかげで、遅延評価との相性が良い。 遅延評価を用いることで、関数間の呼出関係と実際の計算が行われるタイミングを分離することができる。 副作用を必然的に伴う入出力についてはモナドを利用する方法が提案されており、プログラムの純粋性を保ちつつ入出力を行うことができる。
手続き型言語登場の背景
Haskellが重宝されるのは、イミュータブル(状態を持たない)点にある。その背景は、今日のステートレス設計に対するニーズから来てるんだと思う。オブジェクト指向が登場し、あるクラスのインスタンスが複数の利用者で利用されると、外(呼び出し側)から見えないインスタンス内部の状態(ステート)が、バグや処理の複雑さを生む原因の1つになることが多かった。また、たくさんのクライアントからリクエストを受け付けるサーバーシステムでも、極力内部で状態を持たない(ステートレス)ように構築することが経験的に良い設計とされている。
圏論とは?
とにかく抽象度が高いのでとっつきにくい。
トポロジーと圏論
まず、圏論とは何ぞや?と一言でいうと、抽象化を扱う学問という解釈もできる。トポロジーの分野から圏論は生まれたらしい。下記、佐野岳人さんの勉強会セミナーにて、圏論の登場の背景を分かりやすく解説されています。いきなり圏論から入るよりこれ見てから入るとイメージつきやすい。
圏論は抽象化の学問なので、この学問で定義した概念につても、どんどん抽象化されていく。ある「圏」と別の「圏」を比較したい時がある。「圏」と「圏」を結ぶ写像のことを「関手」という。また、「関手」と「関手」を比較したい時もある。「関手」と「関手」を結ぶ写像を「自然変換」という。
圏
対象の集まりと、対象間の関係性(射)の集まりからなる。より正確な圏の定義と圏の具体例は、下記Qitaの記事「もう諦めない圏論入門 -対象と射- 」がわかりやすい。
https://qiita.com/norkron/items/f90d851daf05a2efa567
関手
「圏」と「圏」を結ぶ写像のこと。
自然変換
「関手」と「関手」を結ぶ写像のこと。
圏論とHaskellの関係
純粋関数型言語を成立させるためには、変数という概念を排除する必要がある。そこで必要となってくる考え方が、抽象化(すなわち関係性)を扱う学問である圏論というわけだ。Haskellが圏論の何に基づいているかを、正確さを犠牲にしてわかりやすさを優先して表現するならば、
- 圏の「対象」は、Haskellの「型」に相当する。
- 圏の「射」は、Haskellの「関数」に相当する。
ということになる。下記サイトにわかりやすい解説がある。
https://ja.wikibooks.org/wiki/Haskell/圏論
まとめ
従来プログラミング言語のスレートレスでない弱点から脱却しうるプログラミング言語Haskellには注目している。Facebookでも採用してるらしい。だがしかし。道は長い。