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。。。结束
... (*只查看签名中公开内容的代码*)。。。