Module OCaml-如何查看模块';用户界面?

Module OCaml-如何查看模块';用户界面?,module,ocaml,Module,Ocaml,是否可以在交互式OCaml中查看已加载模块的界面?我已经(未成功)尝试搜索这种可能性,而在线文档/源不是我要寻找的。标准技巧是为模块定义一个同义词,这会导致顶层列出接口 $ ocaml OCaml version 4.00.1 # #load "str.cma";; # module S = Str;; module S : sig type regexp = Str.regexp val regexp : string -> regexp

是否可以在交互式OCaml中查看已加载模块的界面?我已经(未成功)尝试搜索这种可能性,而在线文档/源不是我要寻找的。

标准技巧是为模块定义一个同义词,这会导致顶层列出接口

$ ocaml
        OCaml version 4.00.1

# #load "str.cma";; 
# module S = Str;;
module S :
  sig
    type regexp = Str.regexp
    val regexp : string -> regexp
    val regexp_case_fold : string -> regexp
    val quote : string -> string
    val regexp_string : string -> regexp
    val regexp_string_case_fold : string -> regexp
    val string_match : regexp -> string -> int -> bool
    . . .
    val first_chars : string -> int -> string
    val last_chars : string -> int -> string
  end
更新

(请注意,这个答案来自2013年。OCaml的最新版本提供了一个顶级指令来显示模块接口:

# #show_module Str;;
module Str :
  sig
    type regexp
    val regexp : string -> regexp
    . . .
    val first_chars : string -> int -> string
    val last_chars : string -> int -> string
  end
因此,不再需要半聪明的变通方法


(有许多新指令。在顶级键入
#help;
以获取列表。)

在OCaml顶级版本4.04.0中,定义模块同义词的技巧不再有效:

# module L = List;;
module L = List
#
但您可以使用
include
指令:

# module L = struct include List end;;
module L :
  sig
    val length : 'a list -> int
    val cons : 'a -> 'a list -> 'a list
    val hd : 'a list -> 'a
    val tl : 'a list -> 'a list
    val nth : 'a list -> int -> 'a
    val rev : 'a list -> 'a list
...
    val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list
    val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
  end
#

utopocaml解释器从一开始就添加了#show指令。它完全满足您的要求,如下例所示:

    │ Welcome to utop version 1.19.3 (using OCaml version 4.04.0)  │        
    └──────────────────────────────────────────────────────────────┘        

Type #utop_help for help about using utop. 

─( 15:12:33 )─< command 0 >──────────────────────────────────────{ counter: 0 }─
utop # #show List;;
module List :                                                                     
sig                                                                               
  val length : 'a list -> int                                                 
  val cons : 'a -> 'a list -> 'a list
  val hd : 'a list -> 'a
  ...
  val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list
  val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list
  val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
end
│ 欢迎使用utop版本1.19.3(使用OCaml版本4.04.0)│        
└──────────────────────────────────────────────────────────────┘        
键入#utop_help以获取有关使用utop的帮助。
─( 15:12:33 )─< 命令0>──────────────────────────────────────{计数器:0}─
utop##显示列表;;
模块列表:
信号
val length:'a list->int
val cons:'a->'列表->'列表
val hd:“列表->”a
...
val快速排序:('a->'a->int)->'a list->'a list
val sort_uniq:('a->'a->int)->'a list->'a list
val合并:('a->'a->int)->'a list->'a list->'a list
结束

PS:我使用的是4.04版本,但我知道它也适用于4.03。>也许在这之前也适用。

好主意,ocaml没有以非黑客的方式实现这一点让我感到羞耻。谢谢!我认为这项功能应该由ocaml的IDE提供,而不是由ocaml编译器提供。因此,ocaml不感到羞耻:-)我指的是OCaml的交互式控制台:)这似乎就是你所说的IDE:)是的,编译器知道如何检索和显示多少信息是愚蠢的,但除非你找到一种方法来欺骗它,否则就不会。这可能是非黑客的方式,请参阅我的帖子。所以我想OCaml不会感到羞耻;)您可以直接使用#show指令:#show List;;