1

Haskell wiki page上排名-N-類型告訴這類排名-1型需要Rank2Types擴展

forall a . a -> (forall b . b -> a) 

有排名1.我相信這個事實,似乎可以理解爲我(記住我已經知道如何確定函數的排名)。然而,當我試圖寫下面的代碼:

{-# LANGUAGE ExplicitForAll #-} 

foo :: forall a . a -> (forall b . b -> a) 
foo = undefined 

它不會編譯(GHC 8.0.1),導致下一個錯誤:

• Illegal polymorphic type: forall b. b -> a 
    Perhaps you intended to use RankNTypes or Rank2Types 
• In the type signature: 
    foo :: forall a. a -> (forall b. b -> a) 

所以我想知道:確實foo型真有Rank-2?或者GHC只是沒有一些智能機制來檢測函數的真實等級?有時在教育目的,我想有一些ghci命令狀rank檢查功能類型的真正的行列......

ghci> :rank foo 
foo :: forall a . a -> (forall b . b -> a) -- Rank 1 
+0

在Haskell 98,'forall'不是保留符號。要將它用作顯式量詞,需要這兩種語言擴展中的一種,即使你想寫的類型是等級1.等級1類型通常具有等量形式,其中量詞可以是隱含的,因此這個問題是:期望是隻有當你想要高於1級時,你纔會開啓明確的'forall',你真的需要它。 – pigworker

+1

@pigworker我沒有使用Haskell 98,我使用的是Haskell 2010.我啓用了特定的ghc擴展'-XExplicitForAll'。我只是希望這個擴展可以像假想的'-XRank1Types'那樣工作,如果可能的話,所有'forall'都應該被解除。顯然,最新的ghc用戶指南沒有關於這種行爲的信息:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#explicit-universal-quantification-forall – Shersh

+0

Haskell 2010語言與Haskell 98幾乎相同。新標準包含更多的庫函數,並標準化空數據聲明和模式守衛。如果還有其他的語言擴展本身,那麼它們就非常小。 – dfeuer

回答