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 ).
有两种方法可以处理这种次要的或分层的问题 定义规范。
次要定义可以被视为错误(除了 定义的等效性很容易 已验证)。 这是110.0.3到110.8的政策,其中 上面这样的示例导致了错误消息 错误:结构定义可能不一致 [这是错误1354。] 重新定义可以被视为产生隐含共享 约束(例如。
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=t end,其中类型s=int 这里检测到二次重定义“where type s=int” 导致错误消息。 错误:类型defn应用于定义规范:s 注:这是SML/NJ的分歧,因为上述签名是合法的 SML’97。 请参阅下面的注释“共享类型”。
1.6.4. 类型规范合并
包括