sml中的相互依赖结构

sml中的相互依赖结构,sml,Sml,可以通过和关键字在sml中定义相互依赖的数据类型。现在我有两个相互引用的结构,我看到的错误似乎是因为它是相互递归的,但我看不到一种方法来添加和,这样可能会起作用 例如: structure Machine = struct structure F = Frame ... end structure Frame = struct ... reference to Machine.wordsize end 这是可行的还是设计与sml不兼容?我正在从Ocaml移植代码,显然这是可

可以通过
关键字在
sml
中定义相互依赖的数据类型。现在我有两个相互引用的结构,我看到的错误似乎是因为它是相互递归的,但我看不到一种方法来添加
,这样可能会起作用

例如:

structure Machine = struct 
  structure F = Frame
  ...
end

structure Frame = struct
  ...
  reference to Machine.wordsize
end

这是可行的还是设计与sml不兼容?我正在从
Ocaml
移植代码,显然这是可行的。

这似乎是不可能的。我找到了答案

第1.2.0节中第二个问题的答案,
Q:[Allyn Dimock]递归模块

许多人都要求找到一种定义相互递归的方法 结构(例如命令和命令的相互递归抽象语法) 表达式,每个表达式都在其自己的模块中)。这是可以做到的,尽管 几乎可以肯定的是,一组相互递归的模块必须 作为单个编译单元编译,因此它们不会真正 “独立”模块。但是,递归定义涉及 函子应用程序似乎更加困难,而且相互影响 递归函子将更令人难以置信


在标准ML中,两个结构不能直接相互引用。事实上,即使是一个结构也不能直接指它自己;在类似
structure S=struct。。。结束
,结构标识符
S
..
中的任何出现都必须引用一些以前定义的结构
S
,而不是当前定义的结构。(这是因为定义第32页上的推理规则57和61定义了如何详细阐述结构声明和结构绑定。为了使这种详细阐述是递归的,产生的结构环境SE必须出现在其中一个规则中假设的左侧。)语法确实允许使用
组合结构绑定(在定义第13页的strbind规则中),但其效果与您想要的相反:在类似
结构S=struct。。。结束和T=struct。。。结束
,您甚至不能让
t
引用
S
(因为这两个绑定是在相同的基础上详细阐述的,这意味着绑定
S
的结果在
t
的绑定中不可用)

然而,它可能实现你想要的;你只需要稍微斜一点。例如,一种方法是将两个声明放在
local
声明中,所有重要位声明在顶部:

本地
... (*机架和机器所需的一切*)。。。
在里面
结构框架=结构。。。结束
结构机器=结构。。。结束
结束
另一种方法是,通过连续的细化,将结构声明得有些零碎:

structure Machine=struct。。。字号。。。结束
结构框架=结构。。。字大小。。。结束
结构机器=结构打开机器。。。结束
(这里最后一个声明中提到的
机器
就是第一个声明中绑定的机器。)这种连续优化有时用于在创建好友后“密封”结构:

structure Foo=struct。。。结束
... (*可以完全访问Foo*内核的代码)。。。
结构Foo=Foo:sig。。。结束
... (*只查看签名中公开内容的代码*)。。。