- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这编译得很好:
type List a = [a]
RankNTypes
被包括:
type List2 a = Num a => [a]
type RefF a b = Functor f => (b -> f b) -> (a -> f a)
)并发现它实际上需要
RankNTypes
因为
Functor
约束。
最佳答案
这不是标准
在其中回答问题
简单的答案是标准 Haskell 不允许限定类型同义词声明,即涉及 =>
的类型同义词。 .每 2010 Report ,类型同义词声明的语法是:
type
simpletype=
type
type
,如果你往下看第 4.1.2 节,不能包含上下文。
a
的存在在上下文中无关紧要。没有扩展,GHC 拒绝
type IrrelevantConstraint a = Num Int => [a]
type QualifiedT = Num Int => String
List2 a === forall a. Num a => [a] -- Okay
List2 a -> b === forall a b. (Num a => [a]) -> b -- Not okay
a -> List2 b === forall a b. a -> Num b => [b] -- Not okay
Maybe (List2 a)
等等。在每种情况下,它都不是通常意义上的更高级别的类型。我已经添加了明确的 forall 符号,这当然也不是标准的,以强调这一事实。
=>
出现在类型内部。同样,如果您查看
expression type signatures 上的 2010 年报告部分和
declarations ,你会看到
=>
严格来说不是类型的一部分,而是语法上不同的东西,例如:
exp → exp
::
[context=>
] type
List2
Haskell2010 无效,需要一些语言扩展才能工作。没有具体记录
RankNTypes
允许限定类型同义词声明,但正如您所注意到的那样,它具有这种效果。为什么?
RankNTypes
:
The
-XRankNTypes
option is also required for any type with a forall or context to the right of an arrow (e.g.f :: Int -> forall a. a->a
, org :: Int -> Ord a => a -> a
). Such types are technically rank 1, but are clearly not Haskell-98, and an extra flag did not seem worth the bother.
g
示例与我们的
List2
有关问题:没有
forall
在那里,但是箭头右侧有一个上下文,这是我上面给出的第三个示例。碰巧,
RankNTypes
也启用第二个示例。
forall
我们不会期望的地方,并且没有类型变量:
> import Language.Haskell.TH
> :set -XTemplateHaskell
> runQ [d|type List2 a = Num a => [a]|]
[TySynD List2_2
[PlainTV a_3]
(ForallT []
[ClassP GHC.Num.Num [VarT a_3]]
(AppT ListT (VarT a_3)))]
-- simpler example:
> runQ [d|type T = Num Int => Int|]
[TySynD T_0
[]
(ForallT []
[ClassP GHC.Num.Num [ConT GHC.Types.Int]]
(ConT GHC.Types.Int))]
ForallT
.在模板 Haskell 中,这是有道理的,因为
ForallT
是
Type
的唯一构造函数与
Cxt
字段,即可以包含上下文。如果类型检查器类似地混淆
forall
和约束上下文,这是有意义的
RankNTypes
影响了它的行为。但是呢?
RankNTypes
允许
List2
Illegal polymorphic or qualified type: Num a => [a]
Perhaps you intended to use RankNTypes or Rank2Types
In the type declaration for `List2'
TcValidity.hs
中生成的.我们关心的入口点是
checkValidType
.
-ddump-tc-trace
来验证编译器是否真的进入了那里。 ;错误消息之前的最后一个调试输出是:
Starting validity check [Type constructor `List2']
checkValidType Num a => [a] :: *
checkValidType
,我们看到,缺席
RankNTypes
,
the RHS of a type synonym must have rank 0 . (不幸的是,调试输出没有在这里指定
ctxt
的值,但大概是
TySynCtxt
。)
checkValidType
在这种情况下定义等级,因此:
basic ::= tyvar | T basic ... basic
r2 ::= forall tvs. cxt => r2a
r2a ::= r1 -> r2a | basic
r1 ::= forall tvs. cxt => r0
r0 ::= r0 -> r0 | basic
=>
,以及任何涉及
=>
的类型必须包含
forall
因此,即使
forall
中没有类型变量,也应该是等级 1 或 2 .在
terminology outlined in TcType
,上下文仅出现在 sigma 类型中。
List2
的 RHS。因为它将 RHS 解释为由于其等级资格而排名 1。
theta
表示约束上下文。一线芯
do
块是
forAllAllowed rank
,它听起来像什么。回想一下,类型同义词的 RHS 被限制为 0 级;由于不允许 forall,我们得到一个错误。
RankNTypes
覆盖此限制。如果我们追踪参数
rank
的位置来自,通过
rank0
in checkValidType
然后通过前面几行,我们发现
RankNTypes
标志基本上覆盖了
rank0
限制。 (将这种情况与
default declarations 进行对比。)并且由于额外的上下文被视为排名错误,
RankNTypes
允许它。
关于haskell - 为什么类型同义词中的类约束需要 RankNTypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22945348/
我正在尝试用 C 语言编写一个使用 gstreamer 的 GTK+ 应用程序。 GTK+ 需要 gtk_main() 来执行。 gstreamer 需要 g_main_loop_run() 来执行。
我已经使用 apt-get 安装了 opencv。我得到了以下版本的opencv2,它工作正常: rover@rover_pi:/usr/lib/arm-linux-gnueabihf $ pytho
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
我尝试安装 udev。 udev 在 ./configure 期间给我一个错误 --exists: command not found configure: error: pkg-config and
我正在使用 SQLite 3。我有一个表,forums,有 150 行,还有一个表,posts,有大约 440 万行。每个帖子都属于一个论坛。 我想从每个论坛中选择最新帖子的时间戳。如果我使用 SEL
使用 go 和以下包: github.com/julienschmidt/httprouter github.com/shwoodard/jsonapi gopkg.in/mgo.v2/bson
The database仅包含 2 个表: 钱包(100 万行) 事务(1500 万行) CockroachDB 19.2.6 在 3 台 Ubuntu 机器上运行 每个 2vCPU 每个 8GB R
我很难理解为什么在下面的代码中直接调用 std::swap() 会导致编译错误,而使用 std::iter_swap 编译却没有任何错误. 来自 iter_swap() versus swap() -
我有一个非常简单的 SELECT *用 WHERE NOT EXISTS 查询条款。 SELECT * FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT
我试图按部分组织我的 .css 文件,我需要从任何文件访问文件组中的任何类。在 Less 中,我可以毫无问题地创建一个包含所有文件导入的主文件,并且每个文件都导入主文件,但在 Sass 中,我收到一个
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
这个问题在这里已经有了答案: Updating from Rails 4.0 to 4.1 gives sass-rails railties version conflicts (4 个答案) 关
我们有一些使用 Azure DevOps 发布管道部署到的现场服务器。我们已经使用这些发布管道几个月了,没有出现任何问题。今天,我们在下载该项目的工件时开始出现身份验证错误。 部署组中的节点显示在线,
Tip: instead of creating indexes here, run queries in your code – if you're missing any indexes, you
你能解释一下 Elm 下一个声明中的意思吗? (=>) = (,) 我在 Elm architecture tutorial 的例子中找到了它 最佳答案 这是中缀符号。实际上,这定义了一个函数 (=>
我需要一个 .NET 程序集查看器,它可以显示低级详细信息,例如元数据表内容等。 最佳答案 ildasm 是 IL 反汇编程序,具有低级托管元数据 token 信息。安装 Visual Studio
我有两个列表要在 Excel 中进行比较。这是一个很长的列表,我需要一个 excel 函数或 vba 代码来执行此操作。我已经没有想法了,因此转向你: **Old List** A
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我正在学习 xml 和 xml 处理。我无法很好地理解命名空间的存在。 我了解到命名空间帮助我们在 xml 中分离相同命名的元素。我们不能通过具有相同名称的属性来区分元素吗?为什么命名空间很重要或需要
我搜索了 Azure 文档、各种社区论坛和 google,但没有找到关于需要在公司防火墙上打开哪些端口以允许 Azure 所有组件(blob、sql、compute、bus、publish)的简洁声明
我是一名优秀的程序员,十分优秀!