[erlang-questions] Getting typer to work for me

Torben Hoffmann <>
Tue Dec 15 10:56:40 CET 2009

On Tue, Dec 15, 2009 at 10:45, Kostis Sagonas <> wrote:

> 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.

I thought as much ;-)

> 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.

I got that a bit mixed up, so I will put my faith in Dialyzer going forward
Anyway, what is a man without a dream?!?!

> 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,

It does - I actually did all of the above while waiting for the answer from
above. I see a use for typer, but I will more likely fall in love with
dialyzer instead.

> 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.

That sounds like a good way of adding a little more type formalism to Erlang
- in some situations the type information is actually worth quite a bit.

Thanks for a very good explanation,

More information about the erlang-questions mailing list