在OCaml中,ghci的类型指令相当于什么?

Jas*_*Yeo 7 ocaml haskell types

在ghci中,您可以使用type指令找出任何表达式的类型.

例如,如果我想找出类型\ f g h -> g (h f),我可以使用ghci解释器中的指令,如下所示:

Prelude> :t \ f g h -> g (h f)
\ f g h -> g (h f) :: t2 -> (t1 -> t) -> (t2 -> t1) -> t
Run Code Online (Sandbox Code Playgroud)

OCaml是否有相同的功能?

Ani*_*ddy 14

您可能会发现utop toplevel对此有用.它是标准OCaml顶级的增强版本,但具有:

  • 交互式使用的更明智的默认值(启用短路径)
  • 自动评估一些顶级monad,例如Lwt或Async I/O(因此输入int Deferred.t或int Lwt.t将返回顶层的int)
  • 交互式历史和模块完成以及所有编辑器的优点.

有两种方法可以找到某种东西.对于值,只需将表达式输入到顶层:

$ utop
# let x = 1 ;;
val x : int = 1
# x ;;
- : int = 1
Run Code Online (Sandbox Code Playgroud)

这适用于值,但不适用于类型定义.utop(1.7+)也有一个#typeof指令,可以为你打印出来.

$ utop
# #typeof Unix.sockaddr
type Unix.sockaddr = ADDR_UNIX of string | ADDR_INET of Unix.inet_addr * int
# #typeof ref
type 'a Pervasives.ref = { mutable contents : 'a; }
Run Code Online (Sandbox Code Playgroud)

(最后一个显示ref引用类型只是具有单个可变contents字段的字段的语法糖).

快速转储模块定义的另一个常见技巧是将其别名为新模块.

$ utop
# module L = List ;;
module L : sig
  val hd : 'a list -> 'a
  val tl : 'a list -> 'a list
  val nth : 'a list -> int -> 'a
  <etc>
Run Code Online (Sandbox Code Playgroud)

您可以通过快速安装utop opam install utop.我们建议在Real World OCaml中将其作为新手的首选交互式编辑器,而不是vanilla OCaml toplevel.


Chr*_*lor 5

只需在OCaml解释器中键入该函数,就会自动显示其类型

# fun f g h -> g (h f);;
- : 'a -> ('b -> 'c) -> ('a -> 'b) -> 'c = <fun>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`fun() - > <expression>`也可以. (4认同)