to2yの日記

 | 

2006-09-03ふつける勉強会 第十回目 第11章 「モナド」

11.2 Maybeモナド

data Maybe = Nothing | Just a drving (Eq,Ord)

lookup :: (Eq a) => a -> [(a,b)] -> Maybe b 

lookup関数は、連想リスト(alist)とキーから対応するペアの値が存在する場合に(Just a)をそうでない場合には、Nothingを返す。

Maybeモナド目的(利点)

関数連続して適用する場合に、どこかでNothingになったら、その時点であとの処理をとりやめる」処理をスマート記述できる。

#通常は大域脱出として実現するのが普通

Maybeモナドの仕組み

instance Monad Maybe where
  (Just x) >>= f = f x
  Nothing >>= f  = Nothing
  return x       = Just x

モナド則を満たしていることの証明

モナド則1

  (return x) >>= f
== (Just x) >>= f 
== f x

モナド則2

   m >>= return
(1)mがJust xの場合
    (Just x) >>= return
==  return x
==  Just x == m
(2)mがNothingの場合
    Nothing >>= return
==  Nothing == m

モナド則3

(1) mがJust xの場合
   左辺
== (Just x >>= f) >>= g
== (f x) >>= g
   右辺
== (Just x) >>= (\x -> f x >>= g)
== (\x -> f x >>= g) x
== (f x) >>= g
(2)mがNothingの場合
   左辺
== (Nothing >>= f) >>= g
== (Nothing) >>= g
== Nothing
   右辺
== Nothing >>= (\x -> f x >>= g)
== Nothing

#>>=の左辺が(f x)の形式になっているのがあやしいですが

 |