【发布时间】:2014-04-17 17:53:26
【问题描述】:
我正在尝试了解 monad 转换器,并且正在阅读 haskell wiki 上的 this page。
我很困惑的代码如下:
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..."
到目前为止一切顺利。我可以运行它并且它有效。但是现在,将askPassword 更改为:
askPassword :: MaybeT IO ()
askPassword = do lift $ putStrLn "Insert your new password:"
value <- msum $ repeat getValidPassword
lift $ putStrLn "Storing in database..."
如果不满足有效性条件,这将反复等待我提供新的输入。我有点迷失它是如何做到的。 repeat 永远重复这个动作,而msum 只是foldr mplus mzero,这意味着它沿着列表走并将值“添加”在一起。
为什么当我输入错误时这不立即返回(返回值将是 Nothing)。我想我没有看到决定何时停止和何时继续的逻辑嵌入在哪里。谢谢你的帮助。
【问题讨论】:
标签: haskell