[erlang-questions] dialyzer and #record vs tuple
Vincent de Phily
vincent.dephily@REDACTED
Fri Jun 7 10:50:27 CEST 2013
Hi List,
I'm doing a long-overdue set of dialyzer checks on our software, and have a
few occurences of the following problem:
> % Define a record with a constrained field
> -record(foo, {bar = 0 :: integer()}).
>
> % Use the record, works as expected
> new_foo(Id) -> #foo{bar=Id}.
>
> % Use a similar-looking tuple, dialyzer complains about
> % Record construction #foo{bar::true} violates the declared type of
> % field bar::integer()
> default_options() -> [{foo, true}].
I understand why dialyzer gets confused, since it can't (?) differenciate
between a "raw" tuple and a record. But at the semantic level, they really are
different things, so changing the record definition to allow booleans doesn't
really make sense.
How would you handle that kind of problem ? So far I have resorted to changing
either the name of the record or the tag/arity of the tuple, but it generally
feels wrong and inelegant, and later commits might inadvertantly reintroduce
the natural-but-clashing tuple.
--
Vincent de Phily
More information about the erlang-questions
mailing list