2014-10-16 43 views
8

我注意到我通常构建的函数可以使用透镜获取值,对这些值应用一些函数并返回结果。例如,要总结一对 \pair -> (pair ^. _1) + (pair ^. _2)有了Haskell镜头库,我如何将getter视为“头等舱”?

我觉得应该有一些组合子结合干将头等舱和返回另一个吸附材料(可能的(b -> c -> d) -> Getter a b -> Getter a c -> Getter a d型)的元素。任何帮助?

回答

2

正如在解释顶部的Control.Lens.GetterGetter a b(a -> b)同构。这意味着它们包含相同的信息,并可以随意更改为对方。

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

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

有了这些知识,你可以使用Applicative实例(->),如J.亚伯拉罕已经表明,去创造你想要的功能:我们可以用镜头库提供的功能使之成为相互

myCombinator :: (b -> c -> d) -> Getter a b -> Getter a c -> Getter a d 
myCombinator fn g1 g2 = toGetter (fn <$> fromGetter g1 <*> fromGetter g2) 
+0

我认为这将不得不做。我想我可以定义“<$>”和“<*>”的等价物,将功能提升到这个领域。 – 2014-10-16 12:38:32

3

您可以随时使用Applicative实例(->)

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

,或者有点不太一般,你可能会被Monoid实例来帮助Getter小号

>>> view (_1 <> _2) (Sum 1, Sum 2) 
Sum {getSum = 3}