在Erlang中键入检查

时间:2015-02-23 10:57:39

标签: types erlang

我的理解,-spec仅在Erlang中用于透析器。

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

2 个答案:

答案 0 :(得分:3)

简短回答:你不能。

Erlang是一种动态类型语言,运行时依赖的许多假设要求它是这样的,至少在某些地方是这样。过去曾经讨论过制作强类型子集或功能纯粹的语言子集,但这两种方法都没有证明自己比透析器已经提供的更有价值。

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

答案 1 :(得分:1)

@ zxq9是对的。你不能。但是,我想补充一点,除了透析器之外,你还可以为你的功能定义添加防护。 Dialyzer非常适合静态分析,但在运行时没有帮助。除了定义函数和类型规范之外,还有:

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

您还可以在函数定义中添加保护条件:

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

这可确保在将意外类型传递给函数调用时引发异常。通过使用类型规范和保护,您可以确保仅在指定类型上调用该函数。