我有一些类似的数据类型
data Outer = Outer { _list :: [ Inner ] }
data Inner = Inner { _bool :: Bool }
使用 Control.Lens,我可以像这样访问第 i 个内部的 _bool(位于“State Outer”单子中)
boolValue <- gets (^. list . to (!! i) . inner)
我希望也能够通过类似以下的方式更新该值:
list ^. (to (!! i)) ^. inner %= True
据我所理解,'to'函数仅创建一个getter,而非真正的lens,不能同时用作getter或setter。
那么,我该如何将 (!! i) 转换为lens以便更新此字段?
ix
和element
之间的区别吗?我选择了 Gabriel 的element
,因为它似乎更简单,只需要一个Int
而不是一个Index
。从你提供的文档中,ix
允许的范围更广泛 - 它是否严格更通用? - ajpelement
。并不是说一个比另一个更一般化...ix
是一个类型类,它有许多针对特定索引类型进行索引的实例(例如,使用Int
的列表,带有其索引类型的Map
,具有其域的函数)。element
接受任何可遍历
的类型,并使用Int
索引从左到右计数。在这种情况下,它们碰巧重合。 - shachaf