Rank-1 类型需要 Rank2Types 扩展
Rank-1 Type requires Rank2Types extension
Haskell wiki page 在 Rank-N-Types 上表示此类型
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
此行为的原因记录在 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 在任何箭头之后,尽管这是比 rank-1'd-ness 更严格的要求。由于 Haskell 2010 仅稍微更新了规范,我相信这也适用于 2010。
我相信(但不确定)GHC 编码的方式是在 checkValidType
函数中使用 let r1 = LimitedRank True r0
,它指定 forall
s 可以出现在类型声明,但后续函数参数必须为零,这排除了类型中的 forall b. b -> a
。
标准免责声明:我不是专家,我只有 github 搜索
Haskell wiki page 在 Rank-N-Types 上表示此类型
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
此行为的原因记录在 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 在任何箭头之后,尽管这是比 rank-1'd-ness 更严格的要求。由于 Haskell 2010 仅稍微更新了规范,我相信这也适用于 2010。
我相信(但不确定)GHC 编码的方式是在 checkValidType
函数中使用 let r1 = LimitedRank True r0
,它指定 forall
s 可以出现在类型声明,但后续函数参数必须为零,这排除了类型中的 forall b. b -> a
。
标准免责声明:我不是专家,我只有 github 搜索