Rank-1类型需要Rank2Types扩展名

时间:2016-12-18 16:40:13

标签: haskell types functional-programming higher-rank-types forall

Rank-N-Types上的

Haskell wiki page告诉我们这种类型

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

1 个答案:

答案 0 :(得分:3)

此行为的原因记录在typechecker's TcValidity module

Note [Higher rank types]
~~~~~~~~~~~~~~~~~~~~~~~~
Technically
            Int -> forall a. a->a
is still a rank-1 type, but it's not Haskell 98 (Trac #5957).  So the
validity checker allow a forall after an arrow only if we allow it
before — that is, with Rank2Types or RankNTypes

我不是一个优秀的语言律师,但在任何箭头之后似乎都是the Haskell 98 specification seems to prevent quantifiers,尽管这比排名第一的要求更严格。由于Haskell 2010只是略微更新了规范,我相信这也适用于2010年。

我相信(但不确定)GHC编码的方式是let r1 = LimitedRank True r0函数中的checkValidType,它指定forall可以出现在类型的开头声明但后续函数参数必须为零,这会排除类型中的forall b. b -> a

标准免责声明:我没有专家,我只有github搜索