簡體   English   中英

什么 GHC/Haskell 規范說自由類型構造函數匹配最右邊的類型?

[英]What GHC/Haskell specification says that free type constructors match rightmost types?

最近,當我試圖將帶有一個綁定類型 var 的類型* -> * -> *的構造函數傳遞給期望* -> *的構造函數的 function 時,我措手不及。 具體來說,它是沿着將(\x -> (x, 42)):: (forall a. a -> (a, Int))傳遞到forall c. (forall a. a -> c a) ->... forall c. (forall a. a -> c a) ->... 這是模棱兩可的,但在 GHC 中不是錯誤: (,)強制轉換為* -> *可以解釋為左側或右側參數的構造函數,而 GHC 似乎只是默認為右側參數。 arguments.對於更高種類的匹配,它將采用右邊的 arguments。 要看到這一點,只需測試推斷的類型:

foo :: c a b -> a -> b -> ()
foo _ _ _ = ()

bar = foo ((), 42, 'a') 42 'a' -- typechecks

相反,我錯誤地認為它會按順序匹配自由變量,但這種更高等級的情況是唯一明顯首選的情況,而其他時候則是洗牌。 是否有描述此規則的官方文檔? 我有點惱火,但也理解這不是錯誤的事實,因為我可以預見這可以節省在新類型中包裝很多東西。

除非我誤解了這個問題,否則這只是因為類型應用程序是左關聯的,就像 function 應用程序一樣。

(a, b)(,) ab((,) a) b 所以(Int, a)((,) Int) a ,但(a, Int)不是<something> a

暫無
暫無

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

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