假设我有一个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以便我没有打开模块A中的模块C?
谢谢.
一个简单的方法再出口的东西B是包括A在B:
(* b.ml *)
include A
let string_of_foo = function
| Bar -> "bar"
| Baz -> "baz"
通过此编译b.ml与ocamlc -c -i b.ml,你可以看到发生了什么:
type foo = A.foo = Bar | Baz
val string_of_foo : foo -> string
类型的签名foo中b.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"   
当您只想重新显示模块中定义的某些类型时,这非常有用.(重新include A导出中定义的所有内容A.)
不要忘记写作= A.foo,否则B.foo会变成不同的类型,A.foo即使它具有相同的名称.
通过以下更改之一,您可以直接编写C而无需A直接引用:
open B
let () =
    let f = Bar in
    print_endline (string_of_foo f)
| 归档时间: | 
 | 
| 查看次数: | 185 次 | 
| 最近记录: |