Dialyzer warning when returning a prolist

Paulo Zulato <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CAATrJfeA339RNfABCrPeY=im6GMSdpvCa7p1O8wH9z9mrgmh-g@mail.gmail.com>
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?»
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.