是否有标准的组合器可以将镜头结果打包到函子中?

5

在尝试将具有多层函子的函数应用于主数据结构的成员时,如下面的示例:

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" 中是否已经有这样的东西,如果没有,是否可以使用现有的方法达到同样的效果。

1个回答

2

也许并不是标准方法,但无论如何:alaf可以处理Compose包装。例如:

data SomeProduct = SomeProduct
    { _someProductField :: Bool
    , _anotherProductField :: String
    }
    deriving Show
makeLenses ''SomeProduct

ghci> alaf Compose someProductField (\b -> Just (fromEnum b, not b)) (SomeProduct False "foo")
Just (0,SomeProduct {_someProductField = True, _anotherProductField = "foo"})

如果您仍想定义通用组合器:
inFunctor :: Functor f => Lens s t a b -> Lens s (f t) a (f b)
inFunctor l = alaf Compose l

正是我所需要的!谢谢,祝节日快乐! - Nikita Volkov
@NikitaVolkov 祝你节日快乐 :) - duplode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接