モナド変換子の練習です。
StateモナドにMaybeモナドを乗せてみます。内容はスタック。
import Control.Monad.State push :: a -> StateT [a] Maybe () push x = do xs <- get put (x:xs) pop :: StateT [a] Maybe a pop = do (x:xs) <- get put xs return x main = print $ (`runStateT` [1,10,100]) $ do pop push 3 pop push 2
実行結果は
> main Just ((),[2,10,100]) >
となって動いてますね。
空のstackにpopした場合は、
> print $ (`runStateT` []) $ do { pop; } Nothing >
あれれ、自動的にNothingになったぞ。
これはあれですね、モナドの中でパターンマッチに失敗した場合は、
failが呼ばれるからですね、きっと。
強制的にNothingにしたい場合は関数の中で
lift Nothing
すれば良いです。