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
的东西我可以用在任何一个上吗?@iluvASfmap
对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
的东西我可以用在任何一个上吗?@iluvASfmap
对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
。是的,我只是没有将逆变函子内化到我可以看到一个问题并说“啊哈!逆变函子在这里会有用!”的程度,这意味着我对什么时候函数有用的直觉更少。(不过,我想它们是用在遮光罩下做镜片的?)