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