簡體   English   中英

了解如何應用Haskell函數

[英]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 = ba -> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM