簡體   English   中英

在應用程序的上下文中理解Haskell類型系統

[英]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實例。 但是編譯器不知道這一點。 所有它的說法是, 如果有這樣的實例,那么表達式將變得很好。

(這類似於你有時會看到編譯器希望某些類型同時成為IntegralFractional實例的錯誤。對於人類來說,這是一個荒謬的組合。對於一台機器,它們只是兩個普通的類...... )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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