![](/img/trans.png)
[英]Haskell GHC: what is the time complexity of a pattern match with N constructors?
[英]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.