8

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

我觉得应该有一些组合器来组合第一类吸气剂并返回另一个吸气剂(可能是 type (b -> c -> d) -> Getter a b -> Getter a c -> Getter a d)。有什么帮助吗?

4

2 回答 2

3

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

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

或者,一般来说,您可能会得到s的Monoid实例的帮助Getter

>>> view (_1 <> _2) (Sum 1, Sum 2)
Sum {getSum = 3}
于 2014-10-16T11:37:43.253 回答
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

有了这些知识,您可以使用Applicativefor 的实例(->),正如 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)
于 2014-10-16T12:25:30.373 回答