2015-02-23 201 views
0

我怎么理解,-spec只在Erlang用于透析器。类型检查Erlang

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

+0

您可以编写一个运行编译器和透析器的makefile或类似文件。或者我误解了你的问题? – legoscia 2015-02-23 11:22:01

回答

2

简答:你不行。

Erlang是一种动态类型语言,运行时依赖的许多假设都要求它是这种方式,至少在某些地方。过去一直在讨论制作强类型子集或功能纯语言子集,但这两种方法都没有表现出值得超出透析器已经提供的功能。

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

1

@ zxq9是对的。你不能。不过,我想补充说的是,除了透析器之外,您还可以将警卫添加到您的功能定义中。透析器非常适合静态分析,但不会在运行时提供帮助。除了定义的功能和型号规格,像这样:

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

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

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

这将确保一个例外是,如果一个意外上调类型被传递给函数调用。通过使用类型规范和守卫,你可以确保函数只会在指定的类型上被调用。