我的理解,-spec
仅在Erlang中用于透析器。
如何在编译时检查类型(例如在函数中)(例如在Haskell中如何实现)?
答案 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.
这可确保在将意外类型传递给函数调用时引发异常。通过使用类型规范和保护,您可以确保仅在指定类型上调用该函数。