区分haskell中的错误

时间:2016-12-01 12:43:41

标签: haskell error-handling monads

我还是Haskell的新手。什么是区分错误的最佳方法? 目前我使用的是maybe monad,但它只能代表一种错误状态'。

以下代码段会将我的问题置于上下文中。

pulOh :: Seq          -- input X O sequence
      -> Int          -- split point real index
      -> Maybe Seq
pulOh xs n          =
  case (\(f,l)->(tlTrn f, hdTrn l)) (splSq xs n) of         -- split and process at index
    (Nothing, _)    -> Nothing                              -- first failed
    (_, Nothing)    -> Nothing                              -- last failed
    (Just f,Just l) -> Just (f ++ l)                        -- both parts passed

我希望结果能够区分fstsnd的通话失败。短路两者均未能fst失败。

1 个答案:

答案 0 :(得分:4)

使用Either。它与带有参数化Maybe构造函数的Nothing基本相同,换句话说,Maybe aEither () a同构。通过使用自定义错误标记类型替换()“单位错误”,可以使不同的失败案例不同。

pulOh :: Seq -> Int -> Either String Seq
pulOh xs n = case tlTrn *** hdTrn $ splSq xs n of
    (Nothing, _)    -> Left "first failed"
    (_, Nothing)    -> Left "last failed"
    (Just f,Just l) -> Right $ f ++ l

(我冒昧用***“并行管道替换lambda”)