簡體   English   中英

Haskell如何知道你指的是哪個類型類實例?

[英]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對其進行評估並拋棄返回值,沒有明顯的效果。

這是關於類型推斷的一個有趣的SO線程 不是Haskell特有的,但是很多很好的鏈接和東西可以閱讀函數式語言中的類型推斷。

暫無
暫無

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

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