Sml 使用前定义类型

Sml 使用前定义类型,sml,type-inference,value-restriction,mlton,Sml,Type Inference,Value Restriction,Mlton,根据MLton文件: val r = ref NONE datatype t = A | B val () = r := SOME A 标准ML要求在使用类型之前定义类型。[] 并非所有的实现都强制执行此要求(例如,SML/NJ没有),但上面的链接页面很好地说明了为什么可能需要此要求以确保可靠性(取决于实现如何处理值限制),并且它符合定义中的一些注释: 尽管在我们的定义中没有假设,但我们的目的是,每个上下文C=T,U,E都具有将E命名为tynames的属性⊆ 因此,可以粗略地认为T包含“已生成

根据MLton文件:

val r = ref NONE
datatype t = A | B
val () = r := SOME A
标准ML要求在使用类型之前定义类型。[]

并非所有的实现都强制执行此要求(例如,SML/NJ没有),但上面的链接页面很好地说明了为什么可能需要此要求以确保可靠性(取决于实现如何处理值限制),并且它符合定义中的一些注释:

尽管在我们的定义中没有假设,但我们的目的是,每个上下文C=T,U,E都具有将E命名为tynames的属性⊆ 因此,可以粗略地认为T包含“已生成”的所有类型名。[…]当然,就语义规则而言,关于“已生成”内容的评论并不精确。但以下精确结果很容易证明:

让我们成为一个句子T,U,E⊢ 词组⇒ 一个叫泰尔的人⊆ T、 让我们做一个句子T′,U′,E′⊢ 短语'⇒ A′出现在S的证明中;然后也把E′命名为⊆ T′

[第21页]

但这让我倍感困惑

首先,上述定理似乎是落后的。如果我正确理解短语“发生在S的证明中”,那么这似乎意味着(通过反肯定)“一旦你的上下文违反了tye的意图⊆ T、 所有随后的情况也将违反这一意图”。即使这是真的,似乎断言反之更有用、更有意义,也就是说,“如果到目前为止所有的上下文都符合tye命名的意图⊆ T、 然后,任何随后可推断的背景也将符合该意图”。没有

第二,无论是MLton的陈述还是定义的陈述实际上似乎都没有得到推理规则(或它们后面的“进一步限制”)的支持。一些推理规则具有“tynamesτ”⊆ “或”类型名称的T⊆ T of C”作为附带条件,但本程序不需要这些规则(在上述链接文档中给出):

(特别是:规则(4)与
let
、规则(14)与
=>
、规则(26)与
rec
有关。本程序中不使用这些规则。)

从另一个方向来看,规则(17)涵盖了
数据类型
声明,它只要求生成的类型名称不在C的T中;因此,它不会阻止生成在现有值环境中使用的类型名(除非tynames⊆ T/C)


我觉得我可能错过了一些基本的东西,但我不知道会是什么

关于你的第一个问题,我不知道你为什么建议阅读。结果基本上是说,如果有一个派生S(将其视为一棵树)的上下文满足该条件,那么它的所有子派生(将其视为子树)的上下文也将满足该条件。换句话说,所有规则都保持该条件。将该条件视为上下文C的良好格式要求


关于第二个问题,请注意⊕ 在排序规则(24)中,根据需要扩展C的T。更具体地说,如果
r
被分配类型
t option ref
,那么第一个声明将产生一个具有相应t&in的环境E1;泰名E1。然后,根据排序规则(24),第二个声明必须在上下文C'=C下详细说明⊕ E1,在第4.3节中定义为C+(类型名称E1,E1)。因此,t&in,;根据良好形式的要求,规则(17)将不能选择与
T

Re相同的T作为
T的表示:第一个问题:好的,我想我明白了。由于证明包括推理规则的应用,并且这些规则允许您根据短语组成子短语的语义推断短语的语义,“s′[…]出现在s的证明中”实际上大致意味着“短语”是短语的组成部分”。我有这个权利吗?因此,如果(核心)程序从一个符合此意图的上下文开始,那么这个定理说明程序中的每个声明都将有(即,针对)一个符合它的上下文?这是100%的道理,非常感谢!Re:“关于你的第一个问题,我不知道你为什么建议阅读:出于某种原因,我一直认为“S′[…]在S的证明中出现[S]”大致是指“短语*”在程序中出现的时间比“短语”早。我猜我把证明的方向和程序文本的方向弄混了-P@ruakh是的,没错。也就是说,定义中存在错误,请参见;)。是的,我知道。每当我遇到这种我不明白的事情时,我总是先检查一下你的清单以确定-P