Rank-N-Types のHaskell wiki ページは、この型を示しています
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
タイプは本当にランク 2 を持っていますか? それとも、関数の真のランクを検出するスマートなメカニズムが GHC にないのでしょうか? 教育目的で、関数型の真のランクを検査するghci
ようなコマンドが必要な場合があります...rank
ghci> :rank foo
foo :: forall a . a -> (forall b . b -> a) -- Rank 1