2014-04-09 23 views
0

我一直在检查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 

一个人怎么算出这个弱智?当我尝试部分适用于cher,它似乎并不适合:

The type of `r` is : (b -> Identity b) -> (a -> Identity a) 
The type of `che` is : (b -> Identity b) 

怎样才能描绘出那的r che部分应用程序是(a -> Identity a)

+0

我不知道我理解这个问题,所有的看起来不错。 'che'与第一个输入参数类型'r'结合,所以'r che'作品 –

+0

对不起,我的坏。我现在明白了。 – Sibi

回答

2

当我尝试部分申请车到R,它似乎并不适合:

r具有类型

(b -> Identity b) -> (a -> Identity a) 

这意味着它的第一个参数需要有类型(b -> Identity b)

che具有类型

(b -> Identity b) 

正如需要r,因此r che将工作和有型(a -> Identity a)

应用到第三个参数后,假设它已被命名为argmodify,这arg具有类型ar (Identity . m) arg将有Identity a类型,之后应用就可以了runIdentity,结果将具有类型a


type RefF a b = forall f. Functor f => (b -> f b) -> (a -> f a) 

modify :: RefF a b -> (b -> b) -> a -> a 
modify r m = runIdentity . r (Identity . m) 

你可以推断出modify r m这样类型:

  1. r的类型为RefF a b,这是(b -> f b) -> (a -> f a)
  2. m具有类型b->b
  3. Identity具有类型forall a. a -> Identity a,因此Identity . m的类型为b -> Identity b
  4. r (Identity . m)的类型为a -> Identity a,因为f必须Identity
  5. runIdentity具有类型forall a. Identity a -> a,因此runIdentity . r (Identity . m)具有类型a -> a