【问题标题】:How to get type information in interactive Ocaml?如何在交互式 Ocaml 中获取类型信息?
【发布时间】:2013-01-12 07:33:54
【问题描述】:

我使用的是版本 4 的 Ocaml。当我以交互方式定义某种类型时,解释器会立即打印出该类型的字符串表示形式:

# type foo = Yes | No;;         <-- This is what I entered
type foo = Yes | No             <-- This is what interpreter bounced

但是在我输入更多定义后,有时我想再次查看该类型的文本表示。

在 Haskell 中,我可以输入 ":t foo"。

如何在 Ocaml 中做到这一点?

【问题讨论】:

  • 这是个好问题。据我所知,没有办法。
  • 不幸。显然,在我输入表达式后解释器立即发出的字符串是一种“编译日志”,但之后信息丢失了..
  • 信息肯定不会丢失,因为需要进一步编译。您是否在 Ocaml 列表中询问过,为什么不询问?
  • 从更一般的角度来看,您可能想要尝试更高级的工具,而不仅仅是顶级工具。在 emacs、Typerex、OcalIDE 等中有 Tuareg 模式。其中一些提供了跳转到定义类型 foo 的位置的功能,这可能是回答您问题的一种方式。
  • 如果您还没有使用它,我强烈建议您使用 utop 作为您的顶级而不是 OCaml 附带的标准,

标签: ocaml


【解决方案1】:

在 utop 中,您可以使用 #typeof 指令:

#typeof "list";;
type 'a list = [] | :: of 'a * 'a list 

您可以将值和类型放在双引号内:

let t = [`Hello, `World];;
#typeof "t";;
val t : ([> `Hello ] * [> `World ]) list   

附:更好的解决方案是使用 merlin。

【讨论】:

  • 嘿,谢谢,这很有帮助。我已经按照 GitHub 上的说明将 Merlin 安装到了 Vim 中,但是您必须在 inin Vim 中做什么才能获取表达式的类型?
【解决方案2】:

据我所知,Ocaml中其实没有办法在字符串形式下检索类型信息

您必须为每种类型构建模式匹配

type foo = Yes | No;;

let getType = function
  |Yes -> "Yes"
  |No -> "No"    
  ;;

let a = Yes;;
print_string (getType a);;

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2018-06-11
    • 2015-06-08
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多