gpt4 book ai didi

module - .ml 文件中定义的模块如何引用自身

转载 作者:行者123 更新时间:2023-12-05 01:23:36 25 4
gpt4 key购买 nike

我正在尝试定义一个 Point 模块,它定义了一个表示 2d 点的类型。

我还想包含一个子模块 Point.Set 以便 Point.Set.t 是一种意思是“一组点”的类型。这似乎合乎逻辑且方便,但我无法弄清楚如何制作这涉及的“循环”引用。

我试过这个:

文件:point.ml(隐式定义“Point”模块)

type t = {x: int; y:int}

let compare {x=x1;y=y1} {x=x2;y=y2} = ...implementation omitted for brevity...

module Set = Stdlib.Set.Make(Point)
(* ^^^^^ Internal path Mylib__Point is dangling *)

当我 dune build Mylib 项目/库时,这是在里面。我得到一个错误:

Internal path Mylib__Point is dangling.
The compiled interface for module Mylib__Point was not found.

我不完全确定错误的真正含义,但我认为它可能与我们试图从中引用 Point 模块这一事实有关某些本身内。也许这是不允许的?

我可以通过定义一个单独的“pointSet.ml”文件来解决这个问题,其中包含 include Set.Make(Point)。现在我有一个名为 PointSet 的模块。没关系,但如果 Point.Set 可以是 Point 的子模块,我仍然会觉得它更“美观”。有什么办法可以做到这一点吗?

最佳答案

如果您不介意一些样板文件,我认为这个解决方案可能适合您:

point.ml

module Point = struct
type t = { x : int; y : int }

let compare { x = x1; y = _y1 } { x = x2; y = _y2 } = x1 - x2
end

module Set : Set.S with type elt = Point.t = Set.Make (Point)

include Point

您将有权访问 Point.Set,并且由于 point.ml 在文件末尾包含模块 Point,您不必在其他文件中执行 Point.Point.compare ...


[编辑]

我之前让模块相互递归,但在这种情况下它没用。如果您需要它们相互递归,则必须明确它们的签名:

point.ml

module rec Point : sig
type t

val compare : t -> t -> int
end = struct
type t = { x : int; y : int }

let compare { x = x1; y = _y1 } { x = x2; y = _y2 } = x1 - x2
end

and Set : (Stdlib.Set.S with type elt = Point.t) = Stdlib.Set.Make (Point)

include Point

关于module - .ml 文件中定义的模块如何引用自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72209726/

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