我正在尝试了解monad变换器,我正在阅读haskell wiki上的这个页面.
我困惑的代码如下:
isValid :: String -> Bool
isValid s = length s >= 5
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..."
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我可以运行它,它的工作原理.但现在,askPassword改为:
askPassword :: MaybeT IO ()
askPassword = do lift $ putStrLn "Insert your new password:"
value <- msum $ repeat getValidPassword
lift $ putStrLn "Storing in database..."
Run Code Online (Sandbox Code Playgroud)
如果它不满足有效性条件,这将反复等待我给出新的输入.我有点迷失它是怎么做到的.repeat永远重复这个动作,msum只是foldr mplus mzero,这意味着它沿着列表行走,并将这些值"加"起来.
为什么这不会在我输入错误时立即返回(返回值为Nothing).我想我没有看到决定何时停止以及何时继续的逻辑嵌入的位置.谢谢你的帮助.