Haskellモナドトランスフォーマー(3)
さて、準備が整ったので、getPasswordやそれを利用するコードを書きなおしてみましょう。
getValidPassword :: MaybeT IO String getValidPassword = do s <- lift getLine guard (isValid s) return s askPassword :: MaybeT IO () askPassword = do lift $ putStrLn "Insert your new password: " value <- getValidPassword lift $ putStrLn "Storing in database ... "
(>>=)演算子のお陰で、Nothingなのか、Justなのかをプログラマが手動でチェックする必要がなくなり、随分とすっきりしていますね。
liftを関数getLineやputStrLnに用いることでMaybeT IOモナドにしています。MaybeT IOはMonadPlusのインスタンスでもあるので、パスワードが正しいかは、パスワードがダメなとき、mzero(つまりIO Nothing)を返してくるguardによってチェックすることが出来ます。
ついでながら、正しいパスワードが設定されるまで、永遠に聞き続けるプログラムも簡単に作れます。
askPassword :: MaybeT IO () askPassword = do lift $ putStrLn "Insert your new password: " value <- msum $ repeat getValidPassword lift $ putStrLn "Storing in database ... "