sml中的相互依赖结构

Max*_*Max 3 sml

可以sml通过and关键字定义相互依赖的数据类型.现在我有两个相互引用的结构,看起来我看到的错误是因为它是相互递归的,但我没有看到以这种方式添加and的方法.

例:

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

structure Frame = struct
  ...
  reference to Machine.wordsize
end
Run Code Online (Sandbox Code Playgroud)

这可以使用还是设计不兼容sml?我正在移植代码Ocaml,显然这是在那里工作.

rua*_*akh 9

在标准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
Run Code Online (Sandbox Code Playgroud)

另一种方法是通过连续的改进来声明结构有些零碎:

structure Machine = struct ... wordsize ... end
structure Frame = struct ... M.wordsize ... end
structure Machine = struct open Machine ... end
Run Code Online (Sandbox Code Playgroud)

(这里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 *) ...
Run Code Online (Sandbox Code Playgroud)