Haskell 怎麼推導函數類型呢?
為了推導
lift2 (&<$&>)
我把(2)式代入到(1)中,(a -&> b) 替換 a 得到f (a -&> b), f1 a 替換 b得到f (f1 a), f1 b 替換 c得到f (f1 b)。
(1)lift2 :: Applicative f =&> (a -&> b -&> c) -&> f a -&> f b -&> f c
(2)(&<$&>) :: Functor f =&> (a -&> b) -&> f a -&> f b
最終得到:
在ghci裡面觀察也是正確的。現在想要得到
lift2 (&<$&>) :: (Applicative f, Functor f1) =&> f (a -&> b) -&> f (f1 a) -&> f (f1 b)
lift2 (&<$&>) (,)
, 其中
我就不知道該怎麼代入了...是不是我推導的方式不對?
(,) :: a -&> b -&> (a, b)
正確的應該是這個:
lift2 (&<$&>) (,) :: Functor f =&> (a -&> f b) -&> a -&> f (a, b)
liftA2 (&<$&>) :: (Functor f1, Applicative f) =&> f (a -&> b) -&> f (f1 a) -&> f (f1 b)
因為中綴類型構造器-&>可寫為前綴,並且類型構造器的應用默認是左結合的
(,) :: a -&> b -&> (a, b) = ((-&>) a1) (b1 -&> (a1, b1))
把(,)應用到liftA2,也就是說(,)的類型與f (a -&> b)相同,那麼需要deduce
((-&>) a1) (b1 -&> (a1, b1)) ~ f (a -&> b)
故有
f ~ ((-&>) a1) 這裡的f需要是Applicative但因為Applicative ((-&>) a)所以
f = ((-&>) a1)
(b1 -&> (a1, b1)) ~ (a -&> b)
故有
b1 = a
b = (a1, b1)
代入到(f (f1 a)) -&> (f (f1 b))有:
(((-&>) a1) (f1 b1)) -&> (((-&>) a1) (f1 (a1, b1)))
= (a1 -&> f1 b1) -&> (a1 -&> f1 (a1,b1))
= 你說的(a -&> f b) -&> a -&> f (a, b)
Applicative ((-&>) a)
推薦閱讀:
※haskell 中左箭頭到底做了什麼?
※Equational Reasoning的含義是什麼?
※GHC API 系列筆記(1):入門篇
※為什麼函數式語言中all odd [] 得到True?
※一些近期造的輪子
TAG:Haskell |