合并而不考虑分支的棱镜

问题描述 投票:0回答:1

我有一个可能的结果的总和类型,并且在每个结果中都有一个我要关注的特定“结果”。我知道如何从每个结果中获取“结果”(为此我有很多棱镜),但是我不知道如何组合这些棱镜,以便从整个和类型中获取“结果”,不用担心我正在处理哪种情况。

简化示例:

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 ?
purescript lenses
1个回答
0
投票

这是我到目前为止所取得的最好成绩。是的,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
© www.soinside.com 2019 - 2024. All rights reserved.