Re: Dialyzer warning when returning a prolist
Stanislav Ledenev <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAOkK=A+p6Y62xKpfu_6y_DnAgp8zc4F9gizyk7EkZEDtnLEqLA@mail.gmail.com> |
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 <[email protected]>: > 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?» >