haskell - 我怎样才能避免这些案例陈述?

标签 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

最佳答案

如果 parseDatafromJSON 都将 Either Err a 作为其共域,其中 Err 是固定类型(也许由您定义),那么您可以使用 Either e monad 实例,如下所示:

loadData :: IO (Either Err [Market])
loadData = do
  filedata <- B.readFile "markets.json"
  return $ parseData filedata >>= fromJSON

或者,如果您想要更加圆滑,您可以使用特定的 monad transformer做同样的事情。

关于haskell - 我怎样才能避免这些案例陈述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746253/

相关文章:

haskell - 检查元素是否存在于树中

linux - 安装 svgcairo 时的依赖库

ios - Swift - 在 UIView 的两个子类中重写一个方法

c# - 如何系统地删除和重构未使用的 C# 代码?

haskell - 如何在 ADT 或记录语法上使用 Monadic 绑定(bind)运算符

haskell - 在 Monad 中生成 Rank2Type

ubuntu - 为什么俄语字符显示不正确?

testing - 穷人对遗留代码的依赖注入(inject)

haskell - 使用 - 在 haskell 中加入两个 IO

scala - Reader monad - 它如何符合 Monad 接口(interface)?