gpt4 book ai didi

module - 在 OCaml 中使用一流模块

转载 作者:行者123 更新时间:2023-12-02 06:30:07 24 4
gpt4 key购买 nike

module type Arity =
sig
val arity : nat (* in my real code it has another type *)
end

module S =
functor (A : Arity) -> struct
let check = ...
end

我想在仿函数S内部使用函数check,而不需要实现签名Arity。我读了一流的模块,但仍然不明白如何编写它(在实践中)。这是我的草稿代码:

let A = has type of (module Arity)

然后

let M = S (A)

然后我可以通过

调用 check函数
M.check 

我尝试过:

let f arity = (module (val arity : Arity) : Arity)

它返回:val f:(模块 Arity) -> (模块 Arity)

你能帮我写这个一流的模块吗?我可以用 Ocaml 编写它吗?

也在 ( http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual021.html#toc81 ) 第 7.14 节中说:

“模块表达式 (val expr : package-type) 不能在仿函数主体中使用,...”

我不太明白。您能举个例子帮助我理解吗?

感谢您的帮助。

最佳答案

我不太明白你想知道什么。显然,您会对普通 OCaml 模块和仿函数以及 OCaml 较新的“一流模块”的一些单词感到困惑。无论如何,我给您提供了一个使用 OCaml 4.00.1 的简​​短工作示例(不要尝试使用 3.12.1,因为 4 中的情况得到了改进),可能会对您有所帮助:

module type Arity = sig
val arity :int
end

module S = functor (A : Arity) -> struct
let check = A.arity = 2 (* or whatever *)
end

上面是您为我们提供的一些琐碎的修复以供编译的内容。通常要使用 check,您需要提供签名 Arity 的实现并将其提供给仿函数 S:

module AR = struct
let arity = 3
end

module SAR = S(AR)

let () = Printf.printf "%b\n" SAR.check

让我们使用一流的模块:

let a = (module AR : Arity)

这会将模块 AR 转换为一个值并将其绑定(bind)到变量 a。请注意,括号对于语法是必需的。您还需要提供签名 Arity。也可以这样写:

let a' : (module Arity) = (module AR)

因此 a 和 a' 的类型是(模块 Arity),您需要以某种方式将其提供给编译器。不幸的是,类型推断在这里对我们没有帮助。

您可以按如下方式将值返回到模块:

module A' = (val a)

现在您还可以为仿函数 S 创建一等模块值:

module type RESULT = sig
val check : bool
end

let s (a : (module Arity)) =
let module A = (val a) in
let module SA = S(A) in
(module SA : RESULT)

s 的作用是:获取一个值,将其返回到模块,对其应用仿函数 S,然后从仿函数应用的结果中生成另一个值。签名 RESULT 对于转换是必需的。您不能写入(模块SA:sig val check bool end)。我不擅长这里的事情,但我听说,一流模块值的​​输入不是结构性的,而是名义上的。您需要为(模块 M : X)处的签名命名。

s 的类型是 (module Arity) -> (module RESULT)。让我们将 s 应用于 a:

let m = s a

要访问 m 内部的检查,您需要将其恢复为模块:

let m_check =
let module M = (val m) in
M.check

您可能会失望地看到值<->模块转换是显式的,但这就是它的工作原理......

关于module - 在 OCaml 中使用一流模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606734/

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