[英]Understanding the Haskell type system in the context of applicatives
我正在使用Control.Applicative
,我意識到我不了解Haskell類型系統的所有內容。
這是我在Ghci的實驗:
λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
λ :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b
<*>
的第一個參數的類型是f (a -> b)
。
(pure 2)
統一的,因為常數2
不是a -> b
的類型? Num (a -> b)
是什么意思? 具有a a -> b
類型的函數如何成為Num
的實例? <*>
的第一個參數應該是f (a -> b)
。 所以給定(<*>) (pure x)
,只要x
是某種函數,這是很好的類型。
2
的類型是Num a => a
。 換句話說, 2
可以是任何可能的類型 ,只要它是Num
的實例。
所以在你的表達式(<*>) (pure 2)
,如果2
的類型是函數類型,並且該函數類型具有Num
實例,則這是良好類型的。
當然,幾乎沒有理由要求函數擁有Num
實例。 但是編譯器不知道這一點。 所有它的說法是, 如果有這樣的實例,那么表達式將變得很好。
(這類似於你有時會看到編譯器希望某些類型同時成為Integral
和Fractional
實例的錯誤。對於人類來說,這是一個荒謬的組合。對於一台機器,它們只是兩個普通的類...... )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.