我一直在检查它的类型Lens
以了解它,并且无法确定那里的部分应用程序的结果类型。
初始类型是这样的:type RefF a b = forall f. Functor f => (b -> f b) -> (a -> f a)
上面申请的Identity
functor类型变成了这样:
(b -> Identity b) -> (a -> Identity a)
它们的修改函数定义如下:
modify :: RefF a b -> (b -> b) -> a -> a
modify r m = runIdentity . r (Identity . m)
我将上述定义单独分解以更好地理解它。
从上面,类型Identity . m
是b -> Identity b
我什至使用类型检查器验证了这一点:
check1 :: (b -> b) -> b -> Identity b
check1 m = Identity . m
现在,我尝试制定r (Identity . m)
. 这里是我的头脑变得空虚的地方。部分应用的实际结果r (Identity . m)
似乎a -> Identity a
如下类型检查:
check2 :: RefF a b -> (b -> Identity b) -> a -> Identity a
check2 r che = r che
一个人如何在心理上解决这个问题?当我尝试部分适用che
于 时r
,它似乎不适合:
The type of `r` is : (b -> Identity b) -> (a -> Identity a)
The type of `che` is : (b -> Identity b)
怎么查出偏应用r che
是(a -> Identity a)