[erlang-questions] 12B4 dialyzer problem 5
Kostis Sagonas
kostis@REDACTED
Wed Sep 17 16:56:54 CEST 2008
Anthony Shipman wrote:
> I had a -spec that read
>
> -spec getHandlerModule(string()) -> {ok, Module::atom(), StrmID::integer} |
> error.
You shouldn't have had ;-)
To avoid typos like that, which sadly are very common, we _strongly_
recommend that you follow the convention of writing atoms quoted in spec
declarations. I.e. that you write:
-spec getHandlerModule(string()) ->
{'ok', Module::atom(), StrmID::integer()} | 'error'.
> This caused code like
>
> case getHandlerModule(HName) of
> {ok, Mod, DefaultID} ->
> OptionMeta = Mod:optionMetadata(),
> checkForm(Sess, Arg, OptionMeta, createStream4(DefaultID, HName));
> error ->
> returnError(text:get(invalidHandlerForm))
> end.
>
> to result in the dialyzer message
> The pattern {'ok', Mod, DefaultID} can never match the type 'error'
>
> I can see where my typo is but I can't relate it the error message. I would
> expect that the pattern will always match and I'd get a type error further
> down-stream.
You have a point, but that's not how it works. The inferred success
typing of getHandlerModule/1 gets filtered by the spec declaration, so
the {'ok', atom(), integer()} part of the success typing is thrown away
(because it is not part of the specification of the function) and the
only return value that remains for this function is the atom 'error'.
Dialyzer has warning options which would provide more information in
this case, but these options are off by default. I believe the option
-Wunderspecs would have given you more clues.
Kostis
More information about the erlang-questions
mailing list