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

ant*_*oyo 1 ocaml module

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

type foo = Bar | Baz
Run Code Online (Sandbox Code Playgroud)

一个模块B:

open A

let string_of_foo = function
    | Bar -> "bar"
    | Baz -> "baz"
Run Code Online (Sandbox Code Playgroud)

和一个模块C:

open A
open B

let () =
    let f = Bar in
    print_endline (string_of_foo f)
Run Code Online (Sandbox Code Playgroud)

如何更改模块B以重新导出类型,foo以便我没有打开模块A中的模块C

谢谢.

cam*_*ter 6

一个简单的方法再出口的东西B是包括AB:

(* b.ml *)
include A

let string_of_foo = function
| Bar -> "bar"
| Baz -> "baz"
Run Code Online (Sandbox Code Playgroud)

通过此编译b.mlocamlc -c -i b.ml,你可以看到发生了什么:

type foo = A.foo = Bar | Baz
val string_of_foo : foo -> string
Run Code Online (Sandbox Code Playgroud)

类型的签名foob.ml,type foo = A.foo = Bar | Baz可能会迷惑你,因为它不OCaml中经常看到.它表明该类型B.foo不仅具有相同名称的构造函数,而且完全等同于A.foo.

再出口的另一种方式A.foo,从B是使用这种类型的定义:

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

let string_of_foo = function
  | Bar -> "bar"
  | Baz -> "baz"   
Run Code Online (Sandbox Code Playgroud)

当您只想重新显示模块中定义的某些类型时,这非常有用.(重新include A导出中定义的所有内容A.)

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

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

open B

let () =
    let f = Bar in
    print_endline (string_of_foo f)
Run Code Online (Sandbox Code Playgroud)