如果没有嵌套的case语句,我如何表达以下内容?具体来说,我想按顺序执行这些步骤,如果任何步骤遇到错误的话,则调用失败。科。
loadData :: IO [Market]
loadData = do
filedata <- B.readFile "markets.json"
case parseData filedata of
Left err -> fail err
Right v -> do
case fromJSON v of
Error err -> fail err
Success a -> return a
答案 0 :(得分:4)
如果parseData
和fromJSON
都有Either Err a
作为其密码域,Err
是固定类型(可能由您定义),那么您可以使用{{ 1}} monad实例如此:
Either e
或者,如果你想要额外的光滑,你可以使用特定的monad transformer来做同样的事情。
答案 1 :(得分:2)
你可能想要这里的异常monad变换器。这样的事情(完全未经测试):
import Control.Monad.Trans
import Control.Monad.Except
type MyMonadStack a = ExceptT String IO a
loadData :: MyMonadStack [Market]
loadData = do filedata <- lift $ B.readFile "markets.json"
v <- ExceptT $ parseData filedata
a <- ExceptT $ toEither $ fromJSON v
return a
toEither :: WhateverTypeFromJSONReturns a b -> Either a b
toEither (Error a) = Left a
toEither (Success b) = Right b