コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

モナド変換子の練習

モナド変換子の練習です。
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

すれば良いです。