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

时间:2014-10-16 10:29:06

标签: haskell lens

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

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

2 个答案:

答案 0 :(得分:3)

您始终可以将Applicative实例用于(->)

(+) <$> view _1 <*> view _2 :: Num a => (a,a) -> a

或者,一般情况下,Monoid的{​​{1}}实例可能会为您提供帮助

Getter

答案 1 :(得分:2)

正如Control.Lens.Getter顶部所述,Getter a b(a -> b)同构。这意味着它们包含相同的信息,可以随意更改。我们可以使用镜头库提供的功能将它们互相转换:

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

toGetter :: (a -> b) -> Getter a b
toGetter = to

有了这些知识,您可以使用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)