如果要使用GHC的lexically scoped type variables,則還必須使用explicit universal quantification。也就是說,你必須forall
聲明添加到你的函數的類型簽名:作用域類型變量需要顯式作用。爲什麼?
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}
f :: forall a . [a] -> [a] -- The `forall` is required here ...
f (x:xs) = xs ++ [x :: a] -- ... to relate this `a` to the ones above.
,這實際上有什麼用量化的事情,或做了擴展作者只是籠絡了forall
關鍵字作爲其中一個方便的標記新的,更廣泛的範圍適用?
換句話說,爲什麼我們不能像往常一樣排除forall
?難道不清楚函數體內的註釋中的類型變量是指函數簽名中的同名變量嗎?或者打字會出現問題或模棱兩可?
我在下面提交了自己的回答,但我想知道是否還有其他細節我沒有考慮過。 ... – pash 2013-04-04 01:05:51
由於Haskell-98沒有作用域,所以只有通過forall引入的作用域變量纔是妥協。在打開ScopedTypeVariables時,舊代碼仍然可以工作。 (可以說,Haskell應該總是有範圍化的類型變量。) – augustss 2013-04-04 06:53:56