11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

モナドについて勉強したことの整理

Last updated at Posted at 2015-02-08

学習の素材は、
関数プログラミング実践入門

この表記は、私見・感想です。

個別のモナドについても整理しています。

モナドの用語整理

モナドという聞きなれない言葉からは素直なイメージが湧かないが、ここでは 計算する上で生まれる特定の文脈を効率的に扱うための仕掛け という理解をしておくことにする。

モナド型クラス

モナドは型クラスであり、次のように定義されている。

class Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a

モナドは型クラス、ということは、モナドという性質を実装したインスタンスが存在する、ということ。それがリストだったりMaybeだったりする。

ここでまず、mとかaとかについて言い換えて整理しておきたい。

記号 説明 サンプル
m Monadクラスのインスタンス。何らかの文脈を持つことになる、多相型データ構造。 [], Maybe
a 任意の型を表す型変数。 Int, String
m a m a型のデータ構造。この型を返す関数を、特に モナドmのアクション と呼ぶ。 [Int], Maybe Double
(>>=) bind と呼ばれる演算子で、アクション同士の組み合わせ方。 ["3"] >>= \x -> [7 + read x]
return ただのa型の値にモナドmという文脈を持たせるための関数。命令型言語のreturnとは全然違う return "hoge"
(>>=)の例
--リストモナドのアクションを結合する
*Control.Monad> ["3"] >>= \x -> [7 + read x]
[10]

モナド則

モナド則 (monad laws) と呼ばれる性質を満たすようにインスタンスを作る。これらの規則を満たしていないインスタンスを作っても、それはモナドではないし、直感と反した動作をすることになる。例えば、規則2が満たされていないとして、[1] >> return[123] となってしまったらとても気持ち悪い。

return x >>= f = f x		-- 規則1
m >>= return = m			-- 規則2
( m >>= f ) >>= g = m >>= ( \x -> f x >>= g ) -- 規則3

それぞれを do記法で表記すると、次のようになる。

規則1
do
    y <- return x
    f y
--  == f x
規則2
do
    x <- m
    return x
--  == m
規則3
--左辺
do
    x <- m
    do 
        y <- f x
        g y
--右辺
do y <- do x <- m
           fx
   g y

do記法

文脈を伴う計算を、手続き/命令的に記述するための構文糖衣

参考情報

モナド則がちょっと分かった?

記事内容が大変に分かりやすかったです。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?