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
在Haskell 98,'forall'不是保留符號。要將它用作顯式量詞,需要這兩種語言擴展中的一種,即使你想寫的類型是等級1.等級1類型通常具有等量形式,其中量詞可以是隱含的,因此這個問題是:期望是隻有當你想要高於1級時,你纔會開啓明確的'forall',你真的需要它。 – pigworker
@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
Haskell 2010語言與Haskell 98幾乎相同。新標準包含更多的庫函數,並標準化空數據聲明和模式守衛。如果還有其他的語言擴展本身,那麼它們就非常小。 – dfeuer