Dialyzer warning when returning a prolist

Stanislav Ledenev s.ledenev@REDACTED
Tue May 18 08:50:43 CEST 2021


1. As I understand underspec and overspec requires precise indication of
types.
So for a list of a,b,c atoms you _must_ indicate [a,b,c] but not just a
list of atoms.
Because list of atoms implies a list of any size with any atoms not a list
of 3 specific atoms a,b,c.

2. The only possible reason why proplists:proplist "works" is that the
dialyzer
doesn't know about this type and it is kinda silent in such cases. Try
-Wunknown option.

пн, 17 мая 2021 г. в 23:25, Paulo Zulato <paulozulato@REDACTED>:

> 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/20210518/7f142188/attachment-0001.htm>


More information about the erlang-questions mailing list