Dealing with circular dependencies in OCaml我正在写实验语言的口译员。 该语言的三个主要构造是定义,语句和表达式。 定义可以包含语句和表达式,语句可以包含定义和表达式,一种表达可以包含语句。 我使用联合类型表示所有这些类型,因此我可以轻松地对它们使用模式匹配。 理想情况下,我想将这些代码放在不同的文件中,但是OMake抱怨循环依赖问题。 据我所知,不允许在模块之间进行循环类型定义。 我知道解决此问题的唯一方法是一次定义所有三种类型:
似乎这要求类型的所有代码都在同一文件中。 有没有办法解决? 您如何处理代码中的循环定义? 递归定义需要出现在同一文件中。如果要将定义,语句和表达式分成单独的模块,则可以使用递归模块,但它们仍需要出现在同一文件中。 DAG验证文件间依赖关系是OCaml的烦恼之一。 通过在您所引用的类型上对其类型进行参数化,可以轻松解决此问题:
此技术称为"消除递归结"(参考Gordian结),并在OCaml Journal文章中进行了描述。
干杯, 经常使用的另一种解决方案是抽象接口中的类型。由于类型在接口中是抽象的,因此这些接口不是递归相关的。在实现中,您可以指定类型,并且由于实现仅取决于接口,因此它们也不是递归的。 唯一的问题是,使用此解决方案,您将无法再在其实现之外对这些类型进行模式匹配。 就个人而言,但这可能只是一个口味问题,我喜欢在一个模块中定义所有类型的程序(我认为这有助于提高程序的可读性)。因此,对OCaml的限制对我来说并不是真正的问题。 |