我正在努力使用该lens
库来解决特定问题。我试图通过
- 更新的数据结构
- 聚焦于更新结构的一部分
到另一个函数,g
. 我同时传递了镜头和数据结构,因为g
需要数据结构中的一些共享信息以及一条信息。(如果有帮助,数据结构包含有关联合概率分布的信息,但g
仅适用于任一边缘,并且需要知道我正在查看哪个边缘。两个边缘之间的唯一区别是它们与其余定义的平均值在数据结构中共享)。
我的第一次尝试看起来像这样
f :: Functor f => Params -> ((Double -> f Double) -> Params -> f Params) -> a
f p l = g (l %~ upd $ p) l
where upd = ...
g p x = go p p^.x
但是在编译过程中失败了,因为f
被推断为Identity
用于更新和Const Double
获取器。
完成我想做的事情的最佳方法是什么?我可以想象能够执行以下操作之一:
- 制作镜头的副本,以便在每种情况下类型推断都不同
- 我没有传递更新的结构和镜头,而是传递了原始结构和一个返回修改值的镜头(如果我只想更新镜头所看到的结构部分)。
- 为我的函数/数据结构做出更好的设计选择
- 完全不同的东西
谢谢你的帮助!