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

Module 如何在OCaml中重新导出类型?,module,ocaml,Module,Ocaml,假设我有一个模块a,其定义如下: type foo = Bar | Baz a模块B: 以及模块C: 如何更改模块B以重新导出类型foo,从而不必在模块C中打开模块A 谢谢。我现在只学习了3个月的OCaml,所以我的答案可能不是最好的。但根据我开始读的那本书:打开很多模块不是一个好主意。在您的情况下,我将使用点符号: a模块B: 实际上,只需要第一个A.就可以告诉OCaml您想要的类型。这一条也应该有效: let string_of_foo = function | A.Bar ->

假设我有一个模块a,其定义如下:

type foo = Bar | Baz
a模块B:

以及模块C:

如何更改模块B以重新导出类型foo,从而不必在模块C中打开模块A


谢谢。

我现在只学习了3个月的OCaml,所以我的答案可能不是最好的。但根据我开始读的那本书:打开很多模块不是一个好主意。在您的情况下,我将使用点符号:

a模块B:

实际上,只需要第一个A.就可以告诉OCaml您想要的类型。这一条也应该有效:

let string_of_foo = function
  | A.Bar -> "bar"
  | Baz -> "baz"
但我更喜欢始终如一

以及模块C:


我现在才学习OCaml三个月,所以我的答案可能不是最好的。但根据我开始读的那本书:打开很多模块不是一个好主意。在您的情况下,我将使用点符号:

a模块B:

实际上,只需要第一个A.就可以告诉OCaml您想要的类型。这一条也应该有效:

let string_of_foo = function
  | A.Bar -> "bar"
  | Baz -> "baz"
但我更喜欢始终如一

以及模块C:


在B中再出口物品的一个简单方法是将A包含在B中:

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

type foo = A.foo = Bar | Baz
val string_of_foo : foo -> string
b.ml中foo类型、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中定义的所有内容

不要忘记write=A.foo,否则B.foo将成为与A.foo不同的类型,即使它具有相同的名称

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

open B

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

在B中再出口物品的一个简单方法是将A包含在B中:

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

type foo = A.foo = Bar | Baz
val string_of_foo : foo -> string
b.ml中foo类型、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中定义的所有内容

不要忘记write=A.foo,否则B.foo将成为与A.foo不同的类型,即使它具有相同的名称

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

open B

let () =
    let f = Bar in
    print_endline (string_of_foo f)
你在找?你在找?
open B

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