Dialyzer warning when returning a prolist
Paulo Zulato
paulozulato@REDACTED
Mon May 17 16:48:09 CEST 2021
Hello,
I'm trying to figure out why dialyzer is complaining about a function when
I don't explicitly declare its return as a proplist.
I have this small module which returns a proplist in the form {atom(),
[atom()]}:
> -module(test).
>
> -export([test/0]).
> test() ->
> [
> {one_test, [a,b,c]},
> {another_test, [d,e,f]}
> ].
>
For function above, I made the following spec, but dialyzer has complained
(as stated below) when I enabled its underspecs warnings.
> -spec test() -> [{atom(), [atom()]}].
> % src/test.erl
> % Type specification test:test() -> [{atom(),[atom()]}] is a supertype
> of the success typing: test:test() -> [{'another_test',['d' | 'e' |
> 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]
>
Well... both lists are non-empty lists as stated by dialyzer, so I modified
the spec, without success:
> -spec test() -> [{atom(), [atom(), ...]}, ...].
> %src/test.erl
> % Type specification test:test() -> [{atom(),[atom(),...]},...] is a
> supertype of the success typing: test:test() -> [{'another_test',['d' | 'e'
> | 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]
>
Then I tried to explicitly declare it as a proplist, and dialyzer has
accepted it:
> -spec test() -> proplists:proplist().
> % OK, no warnings.
>
As it worked, I tried to do the same as proplists module does and created
two types, which I used on my new spec. And, surprisingly, dialyzer has
complained about it!
> % From <https://erlang.org/doc/man/proplists.html>
> -type property() :: atom() | tuple().
> -type proplist() :: [property()].
>
> -spec test() -> proplist().
> %src/test.erl
>
% Type specification test:test() -> proplist() is a supertype of the
> success typing: test:test() -> [{'another_test',['d' | 'e' | 'f',...]} |
> {'one_test',['a' | 'b' | 'c',...]},...]
>
Therefore, I could not understand why declaring the return as
"proplists:proplist" is OK while declaring it as lists, nonempty lists or
creating the same types as proplists are not OK. Why is dialyzer
complaining about the other specs? Is dialyzer handling proplists in a
different way? Could someone help me to understand this behaviour?
Best Regards,
Paulo Zulato
--
«Quis custodiet ipsos custodes?»
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20210517/447688db/attachment.htm>
More information about the erlang-questions
mailing list