在标准 ML 中,两个结构不能直接相互引用。事实上,即使是一个结构也不能直接引用它自己;在类似structure S = struct ... end
的情况下,结构标识符中的任何出现S
都...
必须引用一些先前定义的结构S
,而不是当前正在定义的结构。(这是因为定义第 32 页上的推理规则 57 和 61 ,它们定义了结构声明和结构绑定的详细说明。为了使这种详细说明是递归的,生成的结构环境SE必须出现在左侧-这些规则之一中假设的手边。)语法确实允许使用and
(在规则中)组合结构绑定strbind在定义的第 13 页),但它的效果与你想要的相反:在类似的东西中structure S = struct ... end and T = struct ... end
,你甚至不能T
引用S
(因为两个绑定都是在相同的基础上详细阐述的,这意味着绑定的结果S
是在 ) 的绑定中不可用T
。
但是,有可能实现您想要的;你只需要稍微倾斜一点。例如,一种方法是将两个声明放在一个local
声明中,所有重要位都声明在顶部:
local
... (* everything needed for both Frame and Machine *) ...
in
structure Frame = struct ... end
structure Machine = struct ... end
end
另一种方法是稍微零碎地声明结构,并进行连续的改进:
structure Machine = struct ... wordsize ... end
structure Frame = struct ... M.wordsize ... end
structure Machine = struct open Machine ... end
(这里Machine
最后一个声明中提到的是第一个声明中绑定的那个。)这种连续的细化有时用于在创建朋友后“密封”一个结构:
structure Foo = struct ... end
... (* code that has full access to the guts of Foo *) ...
structure Foo = Foo : sig ... end
... (* code that only sees what's exposed in the signature *) ...