MaybeT的这种特殊用途如何运作?

raf*_*lio 3 haskell

我正在尝试了解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).我想我没有看到决定何时停止以及何时继续的逻辑嵌入的位置.谢谢你的帮助.

Mig*_*Mit 5

好吧,msum因为Maybe应该停止在第一次成功尝试,而不是第一次失败.