Erlang类型系统

时间:2009-02-10 12:52:20

标签: compiler-construction erlang type-systems

我一直在网上寻找Erlang程序的各种打字实践,似乎有一些......虽然有点难以找到可靠的信息来源 即我正在寻找有关实用信息:

1。-specs - 这个看起来很有吸引力。一些地方提到在编译时检查具有相关的-specs指令的函数(为了正确的类型用法)...我似乎无法找到更多关于如何使用它的信息(使用哪种工具 - Dialyzer, TYPER?)。我真的很想创建一个小的解析器/代码生成器,从表单的函数声明生成这些“规范”

functionName(param1 :List, param2 :Tuple) -> ...

我还没有看到-spec是否支持抽象类型(用户声明的类型 - “Car”类型 -

{car,{weight,_},{height,_},{maxSpeed,_}}

2. -deftype指令mentioned here

如果我可以开始输入内容并在编译时检查它们,那么Erlang对我来说会变得如此强大。上面提到的解析器/代码生成器的运行时将在输出源代码中生成防护类型检查。

3 个答案:

答案 0 :(得分:14)

此处有关类型和规范属性的更多信息:

http://www.erlang.org/eeps/eep-0008.html

透析器可用于检查它们(参见dialyzer --help)。

Typer可用于生成它们(请参阅typer --help)。

答案 1 :(得分:3)

答案 2 :(得分:1)

编译时间类型检查不是Erlang做的事情。而是使用执行编译后类型检查的Dialyzer。

您创建“用户定义类型”的方式是使用您建议的标记元组。透析器将检查代码路径,以识别MIGHT最终创建失败的函数返回的代码路径。

为了使透析器发挥最佳效果,你必须拥抱'let if failed'并且只写出符合预期结果的条款 - 避开总是匹配的'else'结构和其他一些最佳实践。

您应该使用edoc记录您的功能。透析器使用文档系统的类型规范来为您推断类型。可以找到edoc手册here