首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等级-1类型需要Rank2Types扩展

等级-1类型需要Rank2Types扩展
EN

Stack Overflow用户
提问于 2016-12-18 16:40:12
回答 1查看 168关注 0票数 1

等级-N-类型上的Haskell wiki页面告诉我们这种类型

代码语言:javascript
复制
forall a . a -> (forall b . b -> a)

我相信这个事实,这对我来说似乎是可以理解的(记住我已经知道的关于如何确定函数等级的知识)。但是,当我试图编写下一个代码时:

代码语言:javascript
复制
{-# LANGUAGE ExplicitForAll #-}

foo :: forall a . a -> (forall b . b -> a)
foo = undefined

它不编译(ghc 8.0.1),导致下一个错误:

代码语言:javascript
复制
• 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,来检查函数类型的真正级别.

代码语言:javascript
复制
ghci> :rank foo
foo :: forall a . a -> (forall b . b -> a)  -- Rank 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 18:12:42

这种行为的原因记录在模块中。

代码语言:javascript
复制
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

我不是一个好的语言律师,但似乎Haskell 98规范似乎可以防止量词。在任何箭头,尽管这是一个更严格的要求比排名-1‘d-。由于Haskell 2010只是轻微地更新了规范,我相信这也适用于2010年。

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

标准免责声明:我不是专家,我所拥有的只是github搜索

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41210535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档