我有一个可能的结果的总和类型,并且在每个结果中都有一个我要关注的特定“结果”。我知道如何从每个结果中获取“结果”(为此我有很多棱镜),但是我不知道如何组合这些棱镜,以便从整个和类型中获取“结果”,不用担心我正在处理哪种情况。
简化示例:
type OneAnother = Either Int Int
exampleOneAnother :: OneAnother
exampleOneAnother = Left 10
_one :: Prism' OneAnother Int
_one = _Left
_another :: Prism' OneAnother Int
_another = _Right
_result :: Lens' OneAnother Int
_result = ???
-- How can I combine _one and _another to get result regardless whether its left or right ?
这是我到目前为止所取得的最好成绩。是的,unsafePartial
,明确的大小写匹配...真希望有更好的东西。
_result :: Lens' OneAnother Int
_result = lens getter setter
where
getter :: OneAnother -> Int
getter x@(Left _) = unsafePartial $ fromJust $ preview _one x
getter x@(Right _) = unsafePartial $ fromJust $ preview _another x
setter :: OneAnother -> Int -> OneAnother
setter (Left _) x = review _one x
setter (Right _) x = review _another x