镜头可以像任何普通功能一样组成。我们有:
Lens' a b = forall f . Functor f => (b -> f b) -> a -> f a
现在考虑这个例子:
(.) :: Lens' Config Foo -> Lens' Foo String -> Lens' Config String
展开我们得到:
(.) :: (forall f. Functor f => (Foo -> f Foo) -> Config -> f Config)
-> (forall f. Functor f => (String -> f String) -> Foo -> f Foo)
-> (forall f. Functor f => (String -> f String) -> Config -> f Config)
并且函数组合的类型是:
(.) :: (b -> c) -> (a -> b) -> (a -> c)
它缺乏任何通用量化和类型类约束。现在我的问题是,编译器/类型检查器如何处理这两个特性,以便函数组合运算符可用于组合镜头?
我的猜测是,可以有通用量化的函数和类型类约束,只要它们与正在组合的两个函数匹配。