Search on the blog

2011年4月22日金曜日

Haskell勉強記(5)

またまたまたHaskell。
今日はモナドについて書こうと思う。
  1. モナドの概念
  2. 物理的には(実体は)何なの?
  3. 代表的なモナド
という切り口でモナドについてまとめてみる。

モナドの概念
 モナドでやりたいことは、”複数の演算をつなぐこと”である。具体的には、
  • まず○○をして、そのあと××をしたい。(処理の順序付けをする)
  • ○○をして、失敗したら××はしない。(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 件のコメント:

コメントを投稿