我怎样才能要求变量的类型类?

时间:2018-01-02 16:25:13

标签: ocaml reason bucklescript

我正在尝试学习ReasonML,而且我正在做一些koans来帮助我完成这项任务。我尝试编码的一个koans是在将其转换为数组后要求列表的类型。我知道在某些语言中有些运算符,比如Haskell(:t),我们可以在这些语言中询问变量的类型。 ReasonML是否有:t的等价物?或者检查Array.of_list是否返回数组是没有意义的,因为编译器确保...

2 个答案:

答案 0 :(得分:3)

我对Reason不太了解,但是utop(一个改进的OCaml REPL)提供了#typeof指令来检查表达式的类型:

let a = 42;;
val a : int = 42

#typeof "a";;
val a : int

请注意,这只是一个REPL工具。在OCaml中,类型在运行时不可用:它们在编译期间被剥离。您可以了解有关OCaml编译过程here的更多信息。

正如@Rizo在评论中指出的那样,还有#show指令,它甚至可以在标准的OCaml REPL中使用:

let a = 43;;
val a : int = 43

#show a;;
val a : int

答案 1 :(得分:1)

编译器将确保它是一个数组(当然,除非类型系统已被规避),所以我不确定我是否看到了练习的重点。另外,我认为:tghci命令,而不是Haskell运算符。原因REPL的rtop将打印每个已评估表达式的类型而无需询问,因此,据我所知,不需要:t命令。

Reason / OCaml也不包含运行时类型信息。但是,如果编译为JavaScript,则可以使用Js.Types module来访问JavaScript运行时类型信息。具体来说,Js.Types.classify将返回任何值的JS类型,但当然无法区分Reason / OCaml列表与数组,因为它只知道JavaScript。 Js.typeof是另一个更轻量级的替代方案,它将返回字符串而不是变体。