Background
I have a function that works with MapSets, and I have a set of values (static values) that I need to pass it.
So I have decided to put these values into an attribute, however dialzyer complains and I don’t get why.
Code
defmodule MyApp.Test do
alias MyApp.MyDependency
@data MapSet.new(["a", "b", "c"])
def do_something_with_data(request), do: MyDependency.validate(request, @data)
end
This code gives me the following error:
lib/myapp/test.ex:5: The call ‘Elixir.MyApp.MyDependency’:validate(data@1::any(),#{‘struct’:=‘Elixir.MapSet’, ‘map’:=#{<<:56,:*32>>=>}, ‘version’:=2}) does not have an opaque term of type ‘Elixir.MapSet’:t(_) as 2nd argument
Which is rather confusing.
Why does this work?
I have battled with MapSets before, namely with this opaque value issue. So I tried to trick dialyzer and created the following code, which works:
defmodule MyApp.Test do
alias MyApp.MyDependency
@data ["a", "b", "c"]
def do_something_with_data(request), do: MyDependency.validate(request, MapSet.new(@data))
end
Questions
Why doesn’t the first example work? What am I missing?
Why does the second one work?
Does it have something to do with how the compiler parses the files?