gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:57:17 25 4
gpt4 key购买 nike

我正在尝试了解 monad 转换器,并且正在阅读 this page在 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..."

到目前为止一切顺利。我可以运行这个并且它有效。但现在,将 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)。我想我没有看到决定何时停止和何时继续的逻辑嵌入在哪里。谢谢你的帮助。

最佳答案

嗯,Maybemsum 应该在第一次成功尝试时停止,而不是在第一次失败时停止。

关于haskell - MaybeT 的这种特殊用途是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com