[erlang-questions] Getting typer to work for me

Kostis Sagonas <>
Tue Dec 15 10:45:11 CET 2009


Torben Hoffmann wrote:
> Hi.
> 
> I have the following code:
> 
> -module(ups).
> 
> -export([fup/1]).
> 
> -spec fup(integer()) -> {'ok',integer()} | 'wrong'.
> 
> fup(1) ->
>     {ok,2};
> fup(_) ->
>     not_okay.
> 
> And I sort of expected that typer would find the problem in the fup(_) case,
> but I have to use
> dialyzer -Wspecdiffs --src ups.erl
> in order to get the warning I want (namely that the code does not match the
> spec), but the dialyzer docs warns against using this option.
> 
> Am I asking too much?

Yes, you are.

Granted that currently typer does not have proper documentation, so it's 
morally OK to fantasize whatever you want about what you like typer to 
do to your code ;-), but the fact is that typer is supposed to be just a 
type annotator of Erlang code, not a tool that detects type errors. 
Dialyzer is the tool that is supposed to do the latter.

Typer works as follows: You start with a (partially spec-annotated) set 
of Erlang files.  If the file(s) have some specs for some functions and 
these specs are not totally bogus, these are trusted and all that typer 
does is to generate specs for the rest of the functions in these files.
Only if the specs cannot possibly be correct will typer complain about 
them.  Your spec does not have that property: as far as the type system 
is concerned you have just specified something which is more constrained 
than it needs to be for the input argument and more general than reality 
in the function's returned.  But there is no serious problem here.

Try changing the spec to something really wrong:

    -spec fup(integer()) -> {'ok',atom()} | 'wrong'.

and you will see that typer does indeed complain.

Also, try the file without the spec and you will see that typer will 
give you the inferred success typing:

   -spec fup(_) -> 'not_okay' | {'ok',2}.

But typer will never return anything that differs from specs which are 
already present in the file.  These are simply returned as is.

Hope this explains things,

Kostis

PS. Unrelated to the above, but the next version of dialyzer will report 
a warning in the case of your program without the use of -Wspecdiffs.


More information about the erlang-questions mailing list