[英]How does Haskell know which typeclass instance you mean?
這個問題出現在閱讀關於應用函子的優秀的Learn You a Haskell的新篇章中。
作為Maybe實例的定義的一部分,Applicative類型類具有:
pure = Just
如果我只是去GHCi並導入Control.Applicative,並執行:
pure (3+)
我沒有得到任何東西(有道理)。 但是,如果我在表達式的一部分中使用它:
pure (3+) <*> Just 4
我得到的只是7.我想這也就不足為奇了,但是我錯過了關於類型類如何工作的不可或缺的東西,我認為,這里對pure
的調用沒有任何歧義。
如果我的困惑有意義,任何人都可以詳細解釋發生了什么嗎?
這只是類型推斷。 (<*>)
運算符需要兩個參數才能使用相同的Applicative
實例。 右邊是一個Maybe
,所以左側必須是一個Maybe
。 這就是它如何確定這里使用的實例。 您可以通過鍵入:t expression
來:t expression
解釋器中任何表達式的類型,也許如果您只是瀏覽每個子表達式並查看推斷的類型,您將更好地了解正在發生的事情。
值得看一下編譯器推斷pure (3+)
:
Prelude Control.Applicative> :t pure (3+)
pure (3+) :: (Num a, Applicative f) => f (a -> a)
該術語的類型被重載,關於數字類和應用類的決定被推遲到以后。 但是您可以使用注釋強制特定類型,例如:
*Showfun Control.Applicative> pure (3+) :: Maybe (Double -> Double)
Just <function>
(這是有效的,因為Showfun
有一個實例聲明,它將函數值打印為<function>
。)
這只是編譯器何時積累了足夠的信息來做出決定的問題。
為了擴展newacct的答案,如果沒有足夠的信息來推斷實際類型,編譯器可能(在某些情況下)嘗試選擇默認類型,僅限於滿足相關類型約束的類型。 在這種情況下,對於某些難以確定的Num => n的實例,推斷的類型是IO(n - > n)。 然后GHCi對其進行評估並拋棄返回值,沒有明顯的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.