1
HaskellのエラーモナドとIO Monadを組み合わせたいと思います。ここに私のコードからの抜粋です:エラーをスローした後に計算を再実行
type AskMonad = ErrorT String IO
askSomething :: AskMonad Direction
askSomething = do
liftIO $ putStrLn "Choose an element from the list [1,2,3,4]"
input <- liftIO getLine
let entry = read input :: Int
if entry `elem` [1,2,3,4]
then return $ toEnum entry -- from Int to Direction
else throwError "Invalid input!"
selectMove :: [Player] -> Board -> IO (Direction, Position)
selectMove players board = do
direction <- runErrorT (askSomething) `catchError` --What to put here???
-- Other IO stuff...
私は、次の動作を実現したいと思います:
askSomething
が成功した場合、Direction
を取得します。askSomething
が失敗した場合は、show
エラーが発生し、再度askSomething
を実行してください。
しかし、この動作を取得するには、catchError
の2番目の引数として何を入れるべきかわかりません。私はそれが次のタイプシグネチャであるべきだと思う:Either String Direction -> AskMonad Direction
しかし、再実行する必要がある計算にはどうすればアクセスできますか(この場合はaskSomething
)。
あなたはこの(討論された)[エラー処理in haskell](https://www.schoolofhaskell.com/user/commercial/content/exceptions-best-practices)に興味があるかもしれません。 – mb21