gpt4 book ai didi

haskell - 顺序单子(monad)中优雅的haskell案例/错误处理

转载 作者:行者123 更新时间:2023-12-03 14:57:34 25 4
gpt4 key购买 nike

因为我在我的 other question 中过于简单化了。之前,我想在这里举一个更清楚的例子。

如何处理必须以顺序方式检查某些条件而不嵌套多个案例的情况?对于“顺序方式”,我的意思是获取一个值(例如从标准输入),检查该值是否符合特定条件,并根据结果获取另一个值等等。

例子:

sequen :: IO String
sequen = do
a <- getLine
case a of
"hi" -> do
putStrLn "hello!"
b <- getLine
case b of
"how are you?" -> do
putStrLn "fine, thanks"
return "nice conversation"
_ -> return "error 2"
_ -> return "error 1"

我知道有更好的方法来编写这样的聊天机器人,它应该只是展示问题的顺序性质。如您所见,对于每个嵌套案例,代码也会缩进更深。

有没有办法更好地构造这样的代码?我正在考虑在一个地方处理“错误”并描述“成功路径”,而不会在其上分配错误处理。

最佳答案

当然。这正是EitherT是为。您可以从 Control.Monad.Trans.Either 获取在 eitherT包裹。

import Control.Monad.Trans.Class
import Control.Monad.Trans.Either

main = do
e <- runEitherT $ do
a <- lift getLine
case a of
"hi" -> lift $ putStrLn "hello!"
_ -> left 1
b <- lift getLine
case b of
"how are you?" -> lift $ putStrLn "fine, thanks!"
_ -> left 2
return "nice conversation"
case e of
Left n -> putStrLn $ "Error - Code: " ++ show n
Right str -> putStrLn $ "Success - String: " ++ str
EitherT遇到 left 时中止当前代码块声明,人们通常使用它来指示错误情况。

内部 block 的类型是 EitherT Int IO String .当你 runEitherT它,你得到 IO (Either Int String) . Left类型对应于它失败的情况 leftRight value 表示它成功到达了 block 的末尾。

关于haskell - 顺序单子(monad)中优雅的haskell案例/错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252889/

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