我还是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
我希望结果能够区分fst
或snd
的通话失败。短路两者均未能fst
失败。
答案 0 :(得分:4)
使用Either
。它与带有参数化Maybe
构造函数的Nothing
基本相同,换句话说,Maybe a
与Either () 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”)