gpt4 book ai didi

sml - sml中的相互依赖结构

转载 作者:行者123 更新时间:2023-12-04 18:35:58 25 4
gpt4 key购买 nike

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

例子:

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

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

可以使它工作还是设计与 sml 不兼容? ?我正在从 Ocaml 移植代码显然这在那里有效。

最佳答案

在标准 ML 中,两个结构不能直接相互引用。事实上,即使是一个结构也不能直接引用它自己;类似于 structure S = struct ... end , 结构标识符 S 的任何出现里面...将不得不引用一些先前定义的结构S ,而不是当前正在定义的那个。 (这是因为定义第 32 页上的推理规则 57 和 61,它们定义了结构声明和结构绑定(bind)的详细说明。为了使这种详细说明是递归的,生成的结构环境 SE 必须出现在左侧 -这些规则之一中假设的另一端。)语法确实允许使用 and 组合结构绑定(bind)。 (在定义第 13 页的 strbind 规则中),但它的效果与您想要的相反:类似于 structure S = struct ... end and T = struct ... end , 你甚至不能拥有 T引用 S (因为两个绑定(bind)都在相同的基础上进行了阐述,这意味着绑定(bind) S 的结果在 T 的绑定(bind)中不可用)。

但是,有可能实现您想要的;你只需要稍微倾斜一点。例如,一种方法是将两个声明都放在 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 是在第一个声明中绑定(bind)的那个。)这种连续的细化有时用于在创建 friend 后“密封”结构:

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 *) ...

关于sml - sml中的相互依赖结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17004248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com