10

我一直在网上四处寻找 Erlang 程序的各种打字实践,似乎有一些……尽管找到可靠的信息来源有点困难,即我正在寻找有关以下方面的实用信息:

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

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

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

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

2.这里提到的-deftype指令

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

4

3 回答 3

14

有关 type 和 spec 属性的更多信息在这里:

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

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

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

于 2009-02-10T14:15:52.497 回答
3

看看 http://learnyousomeerlang.com/types-or-lack-thereof (非常清晰的解释)和这​​里的参考:http: //erlang.org/doc/reference_manual/typespec.html

于 2011-06-07T11:28:38.573 回答
1

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

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

为了使透析器发挥最佳效果,您必须接受“如果失败就让”,并且只编写与预期结果匹配的子句 - 避免始终匹配的“其他”结构和其他一些最佳实践。

你应该用 edoc 记录你的函数。透析器使用文档系统的类型规范为您推断类型。可以在此处找到 edoc 手册。

于 2009-02-11T07:33:53.237 回答