今日はモナドについて書こうと思う。
- モナドの概念
- 物理的には(実体は)何なの?
- 代表的なモナド
という切り口でモナドについてまとめてみる。
モナドの概念
モナドでやりたいことは、”複数の演算をつなぐこと”である。具体的には、
- まず○○をして、そのあと××をしたい。(処理の順序付けをする)
- ○○をして、失敗したら××はしない。(Cのforループのbreakのような処理)
とかである。
”参照透過性を保ちつつ、副作用を導入する”のがモナドという内容をよく見るが、これはモナドの概念とは異なる。上記は、IOモナドの機能であって、一般的なモナドの機能ではない。
物理的には(実体は)何なの?
モナドとは、モナド型クラスのインスタンスである。モナド型クラスは、
- return
- >>=
のクラスメソッドをもっていて、この2つの演算は”モナド則”を満たす。
つまり、return、>>=が実装されていて、その実装がモナド則と呼ばれる法則を見てしていれば、それはモナド。
難しい話は置いといて、モナドは一言でいうと”モナド型クラスが持つ機能を実装した型”のこと。
演算子(>>=)の型は以下のとおり。
>>= :: m a -> (a -> m b) -> m b
①モナドの型に入ったaが与えられる。
②そこから、aを取り出して、aをbに変換。モナドで包む。
というイメージ。これは、入れ子のalistに対して関数lookupを適用する例を見ると分かりやすい。
代表的なモナド
以下に代表的なモナドをあげる。
- Maybeモナド
- IOモナド
- リストモナド
Maybeは、alistの検索など、データが存在するか、存在しないか分からない処理を格納する。
IOは、putStrとかgetContentsとか。アクションとは、IOモナドの別名らしい。参照透明性を確保しつつ、副作用を持たせたい場合は、IOモナドが使われます。標準入出力の他にも乱数とかシステム日時取得など。
リストモナドは、リストを扱うためのモナド。リストモナドの目的は、”適用するたびに値の数が増減する関数を連結すること。”
参考文献に分かりやすいサンプルコードがたくさん載ってるので、「モナドって何?」ていう最低レベルのことは理解できると思います。
参考文献:
『ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門』
0 件のコメント:
コメントを投稿