Haskell wiki page on Rank-N-Types 告诉这个类型
forall a . a -> (forall b . b -> a)
排名第一。我相信这个事实,这对我来说似乎很容易理解(记住我已经知道如何确定函数的排名)。但是,当我尝试编写下一个代码时:
{-# 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