Erlang 中的类型检查

Type checking in Erlang

据我了解,-spec 在 Erlang 中仅用于透析器。

我如何在编译时检查类型(例如在函数中)(这是如何实现的,例如在 Haskell 中)?

简答:你不能。

Erlang 是一种动态类型语言,运行时所依赖的许多假设要求它是这样的,至少在某些地方是这样。过去曾讨论过关于制作该语言的强类型子集或纯功能子集,但这两种方法都没有证明自己值得付出超出 dialyzer 已经提供的努力。

也就是说,dialyzer 是一个非常有用的工具如果您构建代码以利用它

@zxq9 说的对。你不能。但是,我想补充一点,除了透析器之外,您还可以在函数定义中添加守卫。 Dialyzer 非常适合静态分析,但在运行时无济于事。除了定义函数和类型规范,像这样:

-spec foo(X :: integer()) -> integer().
foo(X) -> X + 1.

你也可以在函数定义中加入一个保护条件:

-spec foo(X :: integer()) -> integer().
foo(X) when is_integer(X) -> X + 1.

这可确保在将意外类型传递给函数调用时引发异常。通过同时使用类型规范和守卫,您可以确保函数只会在指定类型上被调用。