我该如何避免这些案例陈述?

时间:2014-11-04 22:27:47

标签: haskell refactoring monads

如果没有嵌套的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

2 个答案:

答案 0 :(得分:4)

如果parseDatafromJSON都有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