以前の他の質問で単純化しすぎたので、ここでより明確な例を挙げたいと思います。
複数のケースを入れ子にすることなく、特定の条件を順番にチェックする必要がある状況をどのように処理できますか? 「シーケンシャルな方法」とは、(stdin などから) 値を取得し、この値を特定の条件でチェックし、結果に応じて別の値を取得することなどを意味します。
例:
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"
このようなチャットボットを作成するためのより良い方法があることは知っていますが、それは問題のシーケンシャルな性質を示しているだけです。ご覧のとおり、ネストされたすべてのケースで、コードもより深くインデントされます。
そのようなコードをより適切に構造化する方法はありますか? 「エラー」を 1 か所で処理し、エラー処理を分散させずに「成功パス」を記述することを考えています。