[erlang-questions] Dialyzer: Why do I get a 'will never return success typing error' with this recursive function?
Kostis Sagonas
kostis@REDACTED
Fri Feb 24 21:51:40 CET 2012
On 02/24/12 19:36, Jeremy Raymond wrote:
> On Fri, Feb 24, 2012 at 12:07 PM, Kostis Sagonas<kostis@REDACTED> wrote:
>>
>> Lesson #2: do not spec function args with terms for which the function will
>> not return any value.
>
> So my case where I do want the atypical behaviour to loop with some
> args and no with others, I should forgo the spec and ignore the
> Dialyzer warning? There is no way I can state via aspecs that this is
> indeed the intent of the function?
If your function is indeed like the following one:
test(noloop) ->
ok;
test(loop) ->
test(loop). % dialyzer warns about this call
then there is a very simple thing that you can do: fold the argument in
the function name and make two functions from it:
test_noloop() ->
ok.
test_loop() ->
test_loop().
Dialyzer knows not to complain about calls to test_loop(), esp. so if
you provide a spec that explicitly says that this function has indeed
no_return(). To me, this is a more kosher program and expresses what you
want better than a spec will do.
Kostis
PS. I understand of course that if your program is more involved than
the above, you may need to refactor it a bit -- but dialyzer can guide
you in this: when it complains that some call will never return, it is
sure this call will always end up in the looping clause.
More information about the erlang-questions
mailing list