我一直在检查Lens
的类型以了解它,并且无法找出在那里部分应用的结果类型导致的类型。追踪功能的部分应用类型
初始型是这样的:type RefF a b = forall f. Functor f => (b -> f b) -> (a -> f a)
应用于Identity
算符上述类型变成这样:
(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
我甚证实了这一使用typechecker:
check1 :: (b -> b) -> b -> Identity b
check1 m = Identity . m
现在,我试着制定的r (Identity . m)
类型。这是我心灵空虚的地方。的r (Identity . m)
部分应用程序的实际结果似乎是a -> Identity a
为typechecked如下:
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)
我不知道我理解这个问题,所有的看起来不错。 'che'与第一个输入参数类型'r'结合,所以'r che'作品 –
对不起,我的坏。我现在明白了。 – Sibi