haskell中的错误识别

haskell中的错误识别,haskell,error-handling,monads,Haskell,Error Handling,Monads,我还是哈斯克尔的新手。区分错误的最佳方法是什么? 目前我使用的是可能是monad,但它只能“表示一种错误状态” 下面的代码片段将把我的问题放到上下文中 pulOh :: Seq -- input X O sequence -> Int -- split point real index -> Maybe Seq pulOh xs n = case (\(f,l)->(tlTrn f, hdTrn

我还是哈斯克尔的新手。区分错误的最佳方法是什么? 目前我使用的是
可能是
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均未通过,则短路。

使用。它基本上与
Maybe
相同,具有参数化的
构造函数,或者换句话说,
Maybe a
任一()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)

使用。它基本上与
Maybe
相同,具有参数化的
构造函数,或者换句话说,
Maybe a
任一()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)

谢谢,这非常有效!还有类似于
fmap
的东西我可以用在任何一个上吗?@iluvAS
fmap
a b
都有效,只影响右侧的
b
值。(库中应该有一个更通用的
dimap
,但它并没有被广泛使用)数据的
实例。Bifunctor
提供
bimap fg(左x)=左(fx)
bimap fg(右y)=右(gy
dimap
来自
数据。Profunctor
(我对其理解不够透彻,无法进一步评论)。@chepner关于
Profunctor
类本身没有什么太可怕的地方–它就像一个bifunctor,但在第一个参数中是相反的,也就是说,
a->b
pbc
映射到
pab
,而不是像您使用
(,)
任何一个
(这两个参数都是协变的,由
Bifunctor
表示)。最简单的profuncor是
->
,带有
dimap h g f=g。Fh
。是的,我只是没有将逆变函子内化到我可以看到一个问题并说“啊哈!逆变函子在这里会有用!”的程度,这意味着我对什么时候函数有用的直觉更少。(我想它们是用在遮光罩下做镜片的?)!还有类似于
fmap
的东西我可以用在任何一个上吗?@iluvAS
fmap
a b
都有效,只影响右侧的
b
值。(库中应该有一个更通用的
dimap
,但它并没有被广泛使用)数据的
实例。Bifunctor
提供
bimap fg(左x)=左(fx)
bimap fg(右y)=右(gy
dimap
来自
数据。Profunctor
(我对其理解不够透彻,无法进一步评论)。@chepner关于
Profunctor
类本身没有什么太可怕的地方–它就像一个bifunctor,但在第一个参数中是相反的,也就是说,
a->b
pbc
映射到
pab
,而不是像您使用
(,)
任何一个
(这两个参数都是协变的,由
Bifunctor
表示)。最简单的profuncor是
->
,带有
dimap h g f=g。Fh
。是的,我只是没有将逆变函子内化到我可以看到一个问题并说“啊哈!逆变函子在这里会有用!”的程度,这意味着我对什么时候函数有用的直觉更少。(不过,我想它们是用在遮光罩下做镜片的?)