在尝试将具有多层函子的函数应用于主数据结构的成员时,如下面的示例:
update ::
(SomeProductField -> Maybe (Int, SomeProductField)) ->
(SomeProduct -> Maybe (Int, SomeProduct))
我想出了以下实用工具:
inFunctor :: Functor f => Lens s t a b -> Lens s (f t) a (f b)
inFunctor lens f = getCompose . lens (Compose . f)
让我能够像这样实现update
函数:
someProductFieldLens :: Lens' SomeProduct SomeProductField
update = inFunctor someProductFieldLens
我想知道 "lens" 中是否已经有这样的东西,如果没有,是否可以使用现有的方法达到同样的效果。