我正在尝试学习ReasonML,而且我正在做一些koans来帮助我完成这项任务。我尝试编码的一个koans是在将其转换为数组后要求列表的类型。我知道在某些语言中有些运算符,比如Haskell(:t
),我们可以在这些语言中询问变量的类型。 ReasonML是否有:t
的等价物?或者检查Array.of_list
是否返回数组是没有意义的,因为编译器确保...
答案 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)
编译器将确保它是一个数组(当然,除非类型系统已被规避),所以我不确定我是否看到了练习的重点。另外,我认为:t
是ghci
命令,而不是Haskell运算符。原因REPL的rtop
将打印每个已评估表达式的类型而无需询问,因此,据我所知,不需要:t
命令。
Reason / OCaml也不包含运行时类型信息。但是,如果编译为JavaScript,则可以使用Js.Types
module来访问JavaScript运行时类型信息。具体来说,Js.Types.classify
将返回任何值的JS类型,但当然无法区分Reason / OCaml列表与数组,因为它只知道JavaScript。 Js.typeof
是另一个更轻量级的替代方案,它将返回字符串而不是变体。