Я изучаю erlang и пытаюсь использовать диализатор, чтобы получить максимальную безопасность типа, когда это возможно. Есть одна вещь, которую я не понимаю: какой тип функции не заканчивается и как ее обозначить в спецификации. Не могли бы вы пролить свет на это?Тип функции без конца в erlang
5
A
ответ
7
Функция, которая навсегда и никогда не заканчивается, имеет тип возврата no_return()
. (Этот тип возврата также используется для функций, которые всегда вызывают исключения, например, пользовательскую функцию ошибки. Если вы не укажете этот тип возврата, Dialyzer сообщит вам, что функция «не имеет локального возврата».)
упоминается в главе Types and Function Specifications Справочного руководства Erlang:
Некоторые функции в Эрланге не предназначены для возврата; либо потому, что они определяют серверы или потому, что они используются, чтобы бросать исключения, как показано в следующей функции:
my_error(Err) -> erlang:throw({error, Err}).
Для таких функций, рекомендуется использовать специальный
no_return()
типа для их «возвращения», через договор следующий вид:-spec my_error(term()) -> no_return().
Спасибо! Я не думал, что это может быть применено и к неисключительным функциям! – ppopoff
В этом сообщении блога описывается (непреднамеренное) различие между типами 'no_return()' и 'none()' в Dialyzer: http://joedevivo.com/2015/06/14/no-local-return.html –