处理OCaml中的循环依赖关系

处理OCaml中的循环依赖关系

Dealing with circular dependencies in OCaml

我正在写实验语言的口译员。 该语言的三个主要构造是定义,语句和表达式。 定义可以包含语句和表达式,语句可以包含定义和表达式,一种表达可以包含语句。 我使用联合类型表示所有这些类型,因此我可以轻松地对它们使用模式匹配。 理想情况下,我想将这些代码放在不同的文件中,但是OMake抱怨循环依赖问题。 据我所知,不允许在模块之间进行循环类型定义。

我知道解决此问题的唯一方法是一次定义所有三种类型:

1
2
3
type defn = ...
and stmt = ...
and expr = ...

似乎这要求类型的所有代码都在同一文件中。 有没有办法解决? 您如何处理代码中的循环定义?


递归定义需要出现在同一文件中。如果要将定义,语句和表达式分成单独的模块,则可以使用递归模块,但它们仍需要出现在同一文件中。 DAG验证文件间依赖关系是OCaml的烦恼之一。


通过在您所引用的类型上对其类型进行参数化,可以轻松解决此问题:

1
2
3
type ('stmt, 'expr) defn = ...
type ('defn, 'expr) stmt = ...
type ('defn, 'stmt) expr = ...

此技术称为"消除递归结"(参考Gordian结),并在OCaml Journal文章中进行了描述。

干杯,
乔恩·哈罗普。


经常使用的另一种解决方案是抽象接口中的类型。由于类型在接口中是抽象的,因此这些接口不是递归相关的。在实现中,您可以指定类型,并且由于实现仅取决于接口,因此它们也不是递归的。

唯一的问题是,使用此解决方案,您将无法再在其实现之外对这些类型进行模式匹配。

就个人而言,但这可能只是一个口味问题,我喜欢在一个模块中定义所有类型的程序(我认为这有助于提高程序的可读性)。因此,对OCaml的限制对我来说并不是真正的问题。


推荐阅读

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

    雷蛇设置宏|雷蛇设置宏循环

    雷蛇设置宏|雷蛇设置宏循环,,雷蛇设置宏循环使用雷蛇软件设置宏驱动的方法如下:1、今天小编就以雷蛇鼠标为例,介绍宏定义的使用。当刚买的鼠

    区域语言设置|区域语言设置工具

    区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的

    potplayer设置|potplayer设置循环播放

    potplayer设置|potplayer设置循环播放,,potplayer设置循环播放戴尔电脑上面比较好用的软件有哪些?萊垍頭條敬业签是电脑/移动端/多端云同步

    c4d语言设置|c4d汉语设置

    c4d语言设置|c4d汉语设置,,1. c4d汉语设置mac版的C4D是这样的,中文字体是有的,但是是以拼音的形式存在,比如黑体就是ht。中文字体以拼音方式

    电脑宣传语|电脑宣传语言

    电脑宣传语|电脑宣传语言,,1. 电脑宣传语言1.我做好了与你过一辈子的打算,也做好了你随时要走的准备,2.每段青春都会苍老,但我希望记忆里的你

    office语言设置|微软office语言设置

    office语言设置|微软office语言设置,,微软office语言设置一、首先点击桌面左下角“WIN键”。二、弹出选项内点击“所有程序”。三、接着点