使用Haskell镜头库,我如何将getter视为"头等舱"?

pro*_*hat 8 haskell haskell-lens

我注意到我通常构建使用镜头获取值的函数,将一些函数应用于值并返回结果.例如,将一对元素相加 \pair -> (pair ^. _1) + (pair ^. _2)

我觉得应该有一些组合器来组合getters第一类并返回另一个getter(可能是类型(b -> c -> d) -> Getter a b -> Getter a c -> Getter a d).有帮助吗?

Rei*_*ite 2

正如 上面所解释的Control.Lens.Getter, aGetter a b与 是同构的(a -> b)。这意味着它们包含相同的信息并且可以随意互换。我们可以使用镜头库提供的函数将它们相互转换:

fromGetter :: Getter a b -> (a -> b)
fromGetter g = view g

toGetter :: (a -> b) -> Getter a b
toGetter = to
Run Code Online (Sandbox Code Playgroud)

有了这些知识,您就可以使用 的Applicative实例(->)(如 J. Abrahamson 所示)来创建您想要的函数:

myCombinator :: (b -> c -> d) -> Getter a b -> Getter a c -> Getter a d
myCombinator fn g1 g2 = toGetter (fn <$> fromGetter g1 <*> fromGetter g2)
Run Code Online (Sandbox Code Playgroud)