[erlang-questions] Temporarily violating record type constraints annoys dialyzer

Brujo Benavides elbrujohalcon@REDACTED
Mon Nov 12 12:37:55 CET 2018


And what about adding sane defaults to the fields, then?

Brujo Benavides <http://about.me/elbrujohalcon>



> On 12 Nov 2018, at 08:35, Roger Lipscombe <roger@REDACTED> wrote:
> 
> On 12 November 2018 at 11:11, Brujo Benavides <elbrujohalcon@REDACTED> wrote:
>> Hi Roger,
>> 
>> According to how you use your record, its spec should actually be…
>> 
>> -record widget {
>>   id :: undefined | binary(),
>>   name :: undefined | binary(),
>>   size :: undefined | integer()
>> }.
>> 
>> That will silence dialyzer or, putting it in the right perspective: That
>> will be a spec that matches how your code actually treats that record.
>> And that’s because: What happens if Props doesn’t have a tuple for name?
> 
> I figured someone would say that. The answer is that Props *always*
> has a tuple for name -- it was written to a data store with that
> invariant. But I can see that it's hard to tell dialyzer this.
> 
>> If not having a {name, Name} tuple in Props is an invalid scenario, you
>> should raise some sort of error.
>> In that case I would recommend you to keep the record definition as-is, but
>> fill the whole record at once:
>> 
>> parse_widget(Props) ->
>>  #widget{
>>    id = get_value(id, Props),
>>    name = get_value(name, Props),
>>>>  }.
>> 
>> get_value(Key, Props) ->
>>  {Key, Value} = lists:keyfind(Key, 1, Props),
>>  Value.
> 
> I was kinda hoping to avoid that -- I've got a vague feeling that we
> did this for performance reasons. Of course, those assumptions are
> probably no longer valid and need re-checking.
> 
>> Hope this helps :)
> 
> Only in the "you're doing it wrong" sense :)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20181112/6f3a03cf/attachment.htm>


More information about the erlang-questions mailing list