我慢慢爱上了Erlang,只有一个很大很大的问题。我是Standart ML和ocaml等语言的忠实粉丝,它们具有强大的静态类型检查功能。在erlang中有没有一种好的、干净的方法来引入一些静态类型检查。有人有好的解决办法吗?
ccrfmcuu1#
我也有过这样的经历!我喜欢OCaml和Erlang,并且经常使用它们。当我开始使用Erlang的时候,我已经有多年的OCaml经验了。我花了几个星期的时间来适应编译器中没有静态类型检查器的事实。但在那之后,痛苦就完全消失了。在某种程度上,不使用typechecker是一个值得的练习,对我来说,这是一个很有启发性的经历,真的让我成为一个更好的程序员。不过,还有,一个Erlang的外部静态类型检测器Dializer。我发现它非常有用。它的问题是你需要单独调用它,而且它很慢。偶尔运行一次(例如在提交代码之前或作为自动构建的一部分)工作得很好。我从来没有尝试过在每次编译后运行它,因为等待它完成太分散注意力了。
6ojccjat2#
检查Dialyzer工具Dialyzer是一个静态分析工具,用于识别软件差异,例如明确的类型错误,由于某些编程错误而导致的代码死亡或不可访问,不必要的测试等。
mrwjdhj33#
多年来,有一些尝试在Erlang之上构建类型系统。其中一次尝试发生在1997年,由格拉斯哥Haskell编译器的主要开发人员之一Simon马洛和Philip Wadler进行,Philip Wadler参与了Haskell的设计,并对monads背后的理论做出了贡献(阅读有关上述类型系统的论文)。Joe Armstrong后来评论了这篇论文:有一天Phil打电话给我,告诉我a)Erlang需要一个类型系统,B)他已经写了一个类型系统的小原型,c)他有一年的休假,打算为Erlang写一个类型系统,“我们有兴趣吗?”回答-“是的。”Phil Wadler和Simon马洛在一个类型系统上工作了一年多,结果发表在[20]中。项目的结果有点令人失望。首先,只有语言的一个子集是可类型检查的,主要的遗漏是缺乏进程类型和进程间消息的类型检查。http://learnyousomeerlang.com/types-or-lack-thereof
mqxuamgl4#
我主要使用-spec和-type作为文档:您使用-spec编写规范,然后使用TypEr检查它,然后(在添加一些edoc格式的附加信息之后)生成文档
-spec
-type
aemubtdh5#
现在还有Gradualizer。免责声明:我是其中一个贡献者。Gradualizer是Erlang的一个 * 静态类型检查器 *,支持 * 渐进类型 *。它可以推断一些类型,但主要依赖于函数规范。它检查函数体与其声明的规范的一致性,以及被调用者的规范与传入参数的一致性。它支持等递归类型(扩展为用户类型的用户类型)、联合类型、有限形式的交集类型(多子句规范,即重载函数)。Gradualizer是用Erlang编写的,所以社区应该可以贡献。最近,它可以自检而不报告任何错误。这是一项正在进行的工作,但处于高级阶段,几乎覆盖了整个Erlang语法(元组,记录,Map,诸如此类的东西)。我们知道与编写无类型的Erlang相比,它已经是多么方便(或不方便),并且可以专注于下一步需要改进的最重要的事情。它附带了Rebar 3插件和CLI接口。查看on GitHub或on HexDocs!
5条答案
按热度按时间ccrfmcuu1#
我也有过这样的经历!我喜欢OCaml和Erlang,并且经常使用它们。
当我开始使用Erlang的时候,我已经有多年的OCaml经验了。我花了几个星期的时间来适应编译器中没有静态类型检查器的事实。但在那之后,痛苦就完全消失了。
在某种程度上,不使用typechecker是一个值得的练习,对我来说,这是一个很有启发性的经历,真的让我成为一个更好的程序员。
不过,还有,一个Erlang的外部静态类型检测器Dializer。我发现它非常有用。它的问题是你需要单独调用它,而且它很慢。偶尔运行一次(例如在提交代码之前或作为自动构建的一部分)工作得很好。我从来没有尝试过在每次编译后运行它,因为等待它完成太分散注意力了。
6ojccjat2#
检查Dialyzer工具
Dialyzer是一个静态分析工具,用于识别软件差异,例如明确的类型错误,由于某些编程错误而导致的代码死亡或不可访问,不必要的测试等。
mrwjdhj33#
多年来,有一些尝试在Erlang之上构建类型系统。其中一次尝试发生在1997年,由格拉斯哥Haskell编译器的主要开发人员之一Simon马洛和Philip Wadler进行,Philip Wadler参与了Haskell的设计,并对monads背后的理论做出了贡献(阅读有关上述类型系统的论文)。Joe Armstrong后来评论了这篇论文:
有一天Phil打电话给我,告诉我a)Erlang需要一个类型系统,B)他已经写了一个类型系统的小原型,c)他有一年的休假,打算为Erlang写一个类型系统,“我们有兴趣吗?”回答-“是的。”
Phil Wadler和Simon马洛在一个类型系统上工作了一年多,结果发表在[20]中。项目的结果有点令人失望。首先,只有语言的一个子集是可类型检查的,主要的遗漏是缺乏进程类型和进程间消息的类型检查。
http://learnyousomeerlang.com/types-or-lack-thereof
mqxuamgl4#
我主要使用
-spec
和-type
作为文档:您使用-spec
编写规范,然后使用TypEr检查它,然后(在添加一些edoc格式的附加信息之后)生成文档aemubtdh5#
现在还有Gradualizer。免责声明:我是其中一个贡献者。
Gradualizer是Erlang的一个 * 静态类型检查器 *,支持 * 渐进类型 *。它可以推断一些类型,但主要依赖于函数规范。它检查函数体与其声明的规范的一致性,以及被调用者的规范与传入参数的一致性。它支持等递归类型(扩展为用户类型的用户类型)、联合类型、有限形式的交集类型(多子句规范,即重载函数)。
Gradualizer是用Erlang编写的,所以社区应该可以贡献。最近,它可以自检而不报告任何错误。这是一项正在进行的工作,但处于高级阶段,几乎覆盖了整个Erlang语法(元组,记录,Map,诸如此类的东西)。我们知道与编写无类型的Erlang相比,它已经是多么方便(或不方便),并且可以专注于下一步需要改进的最重要的事情。它附带了Rebar 3插件和CLI接口。
查看on GitHub或on HexDocs!