2016-12-15 121 views
1

我在做Nicta課程練習,並遇到了一個我不明白的例子。 我有兩個函數和它們的類型如下:瞭解如何應用Haskell函數

filtering :: Applicative f => (a -> f Bool) -> List a -> f (List a) 

(>) :: Ord a => a -> a -> Bool 

然後我申請filtering(>)和檢查類型是GHCI。結果類型是:

filtering (>) :: Ord a => List a -> a -> List a 

我不明白這個結果是怎麼產生的。

回答

6

要理解表達filtering (>)手段,你應該知道哪些應用型的例子在這裏使用。

實際上,the instanceApplicative ((->) a)在這裏使用,專門的功能濾波以下述類型(注意,我們使用(b ->)代替下面((->) a),這是相同的)

filtering :: (a -> (b -> Bool)) -> List a -> (b -> (List a)) 

而當施加(>),至統一(a -> (b -> Bool))(a -> (a -> Bool)),我們知道,b必須等於A,所以filtering是專門到

filtering :: (a -> (a -> Bool)) -> List a -> (a -> (List a)) 

因此,我們得到這只是一樣東西GHCI給出的filtering (>)直接

filtering (>) :: (Ord a) => List a -> (a -> (List a)) 

類型。

+0

謝謝你,這回答了我的問題。 –

3

編譯器嘗試統一兩種類型:a -> (a -> Bool)b -> f Bool。它看到lhs和rhs是功能。所以它試圖統一a = ba -> Bool = f Boola = b是統一的。 a -> Bool等同於(->) a Bool。所以,從(->) a Bool = f Bool它得到f = (->) a。如果我們採用替代f = (->) a鍵入表達List a -> f (List a)我們會得到:List a -> (->) a (List a)這相當於用List a -> a -> List a

+0

謝謝你的回答。非常有幫助 –