みどりねこ日記

よくわからないけど、頑張りますよ。

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 ... "