這是類型檢查器中的錯誤嗎?將有效的所有類型賦給let-bound變量時鍵入錯誤
Prelude> let (x :: forall a. a -> a) = id in x 3
<interactive>:0:31:
Couldn't match expected type `forall a. a -> a'
with actual type `a0 -> a0'
In the expression: id
In a pattern binding: (x :: forall a. a -> a) = id
,上面沒有類型檢查,但這種扭曲成功的事實:
Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3
使我認爲「弱prenex轉換」(見this paper 23頁)可能會莫名其妙相關。將forall
嵌入一個不能「浮出」的逆變位置似乎可以保證它不會出現這種奇怪的錯誤。
有趣。我在GHC 6.12.1上得到了一個不同的錯誤信息:「推斷的類型比預期的更少多態性。量化類型變量'a'在表達式id:中轉義。 – hammar
我使用GHC 7.2.1,FWIW。 –
我可能是錯的(我在一個更老的GHC),但這不是合法的Haskell 98/2010。你有什麼擴展?這可能解釋發生了什麼。 (我得到了與Hammar相同的錯誤,所以問題可能是'a'並不意味着你的期望。) –