有没有办法在 OCaml 中获取值的类型,如 c# 或 java 的反射?

wan*_*kai 3 reflection ocaml

我使用 vscode+merlin 来读取 OCaml 代码。有时它可以给我一个类型,但有时它只告诉我一个类型'a,这与告诉我什么都没有一样。我必须通过阅读代码来猜测值的类型。阅读代码来得出值的类型很重要,但有时我怀疑我的猜测是否正确。

所以我想要一个可以在运行时获取值类型的方法,就像 Java 或 C# 中的反射一样。

var a = 1;
Console.WriteLine(a.GetType());
Run Code Online (Sandbox Code Playgroud)

有没有办法在 OCaml 中做同样的事情?

Jef*_*eld 5

OCaml 是静态类型的。也就是说,它的类型仅在编译时存在。在运行时只有值。所以你实际上不可能有一个函数来确定值的类型。

(恕我直言,在编译时确定类型并且不允许程序的行为依赖于运行时的测试类型确实有好处。一般来说,它使程序更清晰且更容易推理。)

如果您想验证对类型的猜测,可以在编译时通过将类型归因于变量(或实际上归因于任何表达式)来完成此操作。

例如你可以说:

let (x : int list) = funtion_to_call arg1 arg2 in
. . .
Run Code Online (Sandbox Code Playgroud)

如果function_to_call返回整数列表以外的内容,编译器将在此时发出错误。