erlang中的非终止函数的类型
问题描述:
我正在学习erlang并尝试使用透析器在可能时获得最大的类型安全性。有一件事我不明白:什么是非终止函数的类型以及如何在spec中表示它。你能否介绍一下这个问题?erlang中的非终止函数的类型
答
永久循环且永不终止的函数具有返回类型no_return()
。 (该返回类型也用于总是抛出异常的函数,例如自定义错误函数,如果不指定返回类型,则Dialyzer会告诉您该函数“没有本地返回”。)
This在Erlang参考手册的Types and Function Specifications一章中提到:
Erlang中的一些函数并不意味着返回;要么是因为他们定义服务器或者是因为它们被用来抛出异常,如下面的功能:
my_error(Err) -> erlang:throw({error, Err}).
对于这样的功能,建议使用特殊
no_return()
类型为他们的“回报”,通过合同如下表格:-spec my_error(term()) -> no_return().
谢谢!我不认为这也可以适用于非终止函数! – ppopoff
这篇博客文章描述了Dialyzer中'no_return()'和'none()'类型之间的(无意)区别:http://joedevivo.com/2015/06/14/no-local-return.html –