haskell - OCaml 中的 ghci 类型指令的等价物是什么?

标签 haskell types ocaml

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

例如,如果我想找出 \ 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

OCaml 是否有类似的功能?

最佳答案

您可以找到 utop顶层对此有用。它是标准 OCaml 顶层的增强版本,但具有:

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

  • 有两种方法可以找到某物的类型。对于一个值,只需将表达式输入到顶层:
    $ utop
    # let x = 1 ;;
    val x : int = 1
    # x ;;
    - : int = 1
    

    这适用于值,但不适用于类型定义。 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; }
    

    (最后一个告诉你 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>
    

    您可以通过opam install utop 快速安装utop .我们在 Real World OCaml 中推荐它作为新手的首选交互式编辑器,而不是普通的 OCaml 顶层。

    关于haskell - OCaml 中的 ghci 类型指令的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19355954/

    相关文章:

    haskell - 未知命令 ':1' haskell

    javascript - 在 JavaScript 中,为什么 (-1).toString 和 (-1 >>> 0).toString 相同,但它们给出不同的结果?

    module - 是否可以不导出 BuckleScript 中的模块?

    optimization - 解包严格字段如何与多态性结合在一起?

    Haskell hClose 阻塞

    generics - 无法创建简洁和通用的错误类型

    graphics - 如何编译ocaml图形窗口cygwin

    ocaml - 使用 dune 将生成的可执行文件复制到我的根目录中

    algorithm - Haskell - 在笛卡尔网格中对特定的最近邻居进行分组

    types - Julia 1.x 中类型不稳定函数的简单示例,具有性能影响