So the thing is not that Erlang is bad. It is that I do not know how to use dialyzer properly. Type information is lost. One way around this is to add "check" functions that do nothing, but have a type signature. EDIT: It is hard to make the dialyzer precise enough. The best bet is still to add a lot of annotations.