Purescript 组合棱镜以聚焦于某个值,而不考虑分支

Purescript 组合棱镜以聚焦于某个值,而不考虑分支,purescript,lenses,Purescript,Lenses,我有一个可能结果的总和类型,在每个结果中都有一个我想要关注的“结果”。我知道如何从每个结果中得到“结果”(我有一堆棱镜),但我不知道如何组合这些棱镜,这样我就可以从整个sumtype中获得“结果”,而不用担心我在哪种情况下 简化示例: 键入oneother=Int或Int 互相 例如,彼此=左10 _一个::棱镜’另一个Int _左一 _另一个::Prism'one另一个Int _另一个=_对吗 _结果::Lens'other Int _结果=??? --我怎样才能把一个和另一个结合起来,不管结

我有一个可能结果的总和类型,在每个结果中都有一个我想要关注的“结果”。我知道如何从每个结果中得到“结果”(我有一堆棱镜),但我不知道如何组合这些棱镜,这样我就可以从整个sumtype中获得“结果”,而不用担心我在哪种情况下

简化示例:

键入oneother=Int或Int
互相
例如,彼此=左10
_一个::棱镜’另一个Int
_左一
_另一个::Prism'one另一个Int
_另一个=_对吗
_结果::Lens'other Int
_结果=???
--我怎样才能把一个和另一个结合起来,不管结果是左还是右?

这是迄今为止我得到的最好的。是,
unsafePartial
,显式大小写匹配。。。真希望有更好的

\u结果::Lens'彼此Int
_结果=透镜吸气剂设置器
哪里
getter::彼此->Int
getter x@(左)=未安全部分$fromJust$preview\u one x
getter x@(右)=未安全部分$fromJust$preview\u另一个x
setter::one-one->Int->one-one
设定器(左)x=检查一个x
setter(右)x=查看另一个x

棱镜一旦聚焦,就会失去上下文。因此,我看不到一种方法可以用一个和另一个来定义结果。但你肯定可以比诉诸于
unsafePartial
做得更好:

导入Data.Lens.Lens(Lens',Lens)
导入Data.Profunctor.Choice((| | |),(+++)
键入oneother=Int或Int
_结果::Lens'other Int
_结果=透镜吸气剂设置器
哪里
getter=identity | | | identity
设定器e x=(常数x+++常数x)e

从存储库中窃取了此文件:

——|将镜头转换为“镜头”接受的形式。
lensStore::对于所有s t a b。ALens t a b->s->Tuple a(b->t)
镜头存储l=带镜头l(lift2元组)
不知怎的,它没有出口。有了这些帮助,以下解决方案应该足够通用:

导入前奏曲 进口管制。申请(lift2) 导入Data.Lens.Common 导入Data.Lens.Lens 导入Data.Lens.Prism 导入Data.Profunctor.Choice((| | |),(+++) 导入数据。元组 _结果::Lens'other Int _结果=透镜吸气剂设置器 哪里 getter=identity | | | identity 设定器e x=(常数x+++常数x)e lensStore::对于所有s t a b。ALens t a b->s->Tuple a(b->t) 镜头存储l=带镜头l(lift2元组) 数据ABC =整数 |B(元组布尔整数) |彼此 lensABCInt::Lens'ABC Int lensABCInt=透镜的外壳 A i->映射LenssStore标识i B i->地图B lensStore\u 2 i C i->映射C LenssStore\u结果i
这里
ABC
是您的目标金额类型。只要它的每一个变体都有一个镜头,你就有了一个整体镜头。

这当然看起来更好,但它与其中任何一个都有联系。事实上,我有一个不同的总和类型,有两个以上的选择。我认为我不能用| | | |和++++轻松地编写它们。但这是一个有趣的方向。谢谢。@MnZrK答案扩展。这太棒了!正是我需要的。非常感谢。