0

我一直在检查它的类型Lens以了解它,并且无法确定那里的部分应用程序的结果类型。

初始类型是这样的:type RefF a b = forall f. Functor f => (b -> f b) -> (a -> f a)

上面申请的Identityfunctor类型变成了这样:

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

它们的修改函数定义如下:

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

我将上述定义单独分解以更好地理解它。

从上面,类型Identity . mb -> 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)

4

1 回答 1

2

当我尝试将 che 部分应用于 r 时,它似乎不适合:

r有类型

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

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

che有类型

(b -> Identity b)

根据r需要,因此r che将工作并具有 type (a -> Identity a)

应用到第三个参数后,假设它被命名为arg, of modify, thisarg有 type ar (Identity . m) arg将有 type Identity a,应用runIdentity在它上面后,结果将有 type 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
于 2014-04-09T15:20:55.047 回答