1.6. SML/NJ模块扩展

1.6.1. 高阶函子

1.6.2. 结构定义规范

1.6.3.哪里结构定义条款

1.6.4. 忽略分层重定义

结构定义规范很容易引起重新定义。考虑以下示例:

签名S1=信号发生器t型结束;签名S2=信号发生器结构A:S1结构B:S1=A结束;签名S3=信号发生器结构C:S2结构D:S2=C结束;
这里是下部结构D.B公司属于第3章已定义在内部S2系列依据D.答(暗示D.B.t=D.A.t),而根据定义规范在里面第3章,D.B公司等于C.B公司(暗示D.B.t=C.B.t).

有两种方法可以处理这种次要的或分层的问题定义规范。

  1. 次要定义可以被视为错误(除了定义的等效性很容易已验证)。这是110.0.3到110.8的政策,其中上面这样的示例导致了错误消息
    错误:结构定义可能不一致
    [这是错误1354。]
  2. 重新定义可以被视为产生隐含共享约束(例如。D.A.t=C.B.t在这种情况下)。
在案例(2)中,将验证这些隐含的共享约束在签名匹配过程中自动所有定义规范。问题是他们是否在实例化签名式第3章.我们采取不处理的宽松政策实例化期间的这些隐含约束。相反,在实例化次要定义被忽略。例如,内部定义D.B.t=D.A.t次要定义D.B.t=C.B.t被忽略。

这项政策的后果是签名将被成功实例化。像往常一样,任何尝试匹配这些不一致的签名将失败。

编译器标志

编译器。Control.multDefWarn:布尔引用
控制当辅助定义被忽略。它的默认值为false,表示没有警告将生成消息。

在其他一些情况下,例如分层类型,我们遵循更严格的政策定义规格:

签名S=sig类型t类型s=tend,其中类型s=int
这里检测到二次重定义“where type s=int”导致错误消息。
错误:类型defn应用于定义规范:s
注:这是SML/NJ的分歧,因为上述签名是合法的SML’97。请参阅下面的注释“共享类型”。

1.6.4. 类型规范合并包括


戴夫·麦奎因
上次修改时间:1999年2月8日星期一14:32:33 EST