gpt4 book ai didi

module - 如何在 OCaml 中重新导出类型?

转载 作者:行者123 更新时间:2023-12-05 01:02:42 24 4
gpt4 key购买 nike

假设我有一个模块 A,它的定义如下:

type foo = Bar | Baz

一个模块B:

open A

let string_of_foo = function
| Bar -> "bar"
| Baz -> "baz"

和一个模块C:

open A
open B

let () =
let f = Bar in
print_endline (string_of_foo f)

如何更改模块 B 以重新导出类型 foo ,这样我就不用在模块 C?

谢谢。

最佳答案

B 中重新导出内容的一种简单方法是在 B 中包含 A:

(* b.ml *)
include A

let string_of_foo = function
| Bar -> "bar"
| Baz -> "baz"

通过用ocamlc -c -i b.ml编译这个b.ml,你可以看到发生了什么:

type foo = A.foo = Bar | Baz
val string_of_foo : foo -> string

b.mlfoo类型的签名,type foo = A.foo = Bar | Baz 可能会让你感到困惑,因为它在 OCaml 中并不常见。说明 B.foo 类型不仅有同名的构造函数,而且与 A.foo 完全等价。

B 重新导出 A.foo 的另一种方法是使用这种类型定义:

(* b.ml *)
type foo = A.foo = Bar | Baz

let string_of_foo = function
| Bar -> "bar"
| Baz -> "baz"

当您只想重新公开模块中定义的某些类型时,这很有用。 (include A 重新导出 A 中定义的所有内容。)

不要忘记写 = A.foo,否则 B.foo 会变成与 A.foo 不同的类型,即使它有同名。

通过这些更改之一,您可以编写 C 而无需直接引用 A:

open B

let () =
let f = Bar in
print_endline (string_of_foo f)

关于module - 如何在 OCaml 中重新导出类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28870250/

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