[英]Understanding how Haskell functions are applied
我正在做Nicta課程練習,在那里遇到了一個我不理解的例子。 我有兩個函數,它們的類型如下:
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
我不明白這個結果是如何產生的。
要了解表達式filtering (>)
含義,您應該知道此處使用了哪個Applicative實例。
實際上,這里使用了實例 Applicative ((->) 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))
所以我們直接得到filtering (>)
類型filtering (>)
filtering (>) :: (Ord a) => List a -> (a -> (List a))
這與給出的GHCi相同。
編譯器嘗試統一兩種類型: a -> (a -> Bool)
與b -> f Bool
。 它看到lhs和rhs是函數。 因此,它嘗試統一a = b
和a -> Bool = f Bool
。 a = 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
等價List a -> a -> List a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.