我注意到我通常构建的函数可以使用透镜获取值,对这些值应用一些函数并返回结果。例如,要总结一对 \pair -> (pair ^. _1) + (pair ^. _2)
有了Haskell镜头库,我如何将getter视为“头等舱”?
我觉得应该有一些组合子结合干将头等舱和返回另一个吸附材料(可能的(b -> c -> d) -> Getter a b -> Getter a c -> Getter a d
型)的元素。任何帮助?
我注意到我通常构建的函数可以使用透镜获取值,对这些值应用一些函数并返回结果。例如,要总结一对 \pair -> (pair ^. _1) + (pair ^. _2)
有了Haskell镜头库,我如何将getter视为“头等舱”?
我觉得应该有一些组合子结合干将头等舱和返回另一个吸附材料(可能的(b -> c -> d) -> Getter a b -> Getter a c -> Getter a d
型)的元素。任何帮助?
正如在解释顶部的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.亚伯拉罕已经表明,去创造你想要的功能:我们可以用镜头库提供的功能使之成为相互
myCombinator :: (b -> c -> d) -> Getter a b -> Getter a c -> Getter a d
myCombinator fn g1 g2 = toGetter (fn <$> fromGetter g1 <*> fromGetter g2)
您可以随时使用Applicative
实例(->)
(+) <$> view _1 <*> view _2 :: Num a => (a,a) -> a
,或者有点不太一般,你可能会被Monoid
实例来帮助Getter
小号
>>> view (_1 <> _2) (Sum 1, Sum 2)
Sum {getSum = 3}
我认为这将不得不做。我想我可以定义“<$>”和“<*>”的等价物,将功能提升到这个领域。 – 2014-10-16 12:38:32