dcrck

dcrck

Confusing dialyzer warning: The pattern can never match the type

Hi, a user found an issue when attempting to use my Ultraviolet library: Unexpected Dialyzer issue · Issue #1 · dcrck/ultraviolet · GitHub

defmodule MyModule do
  require Logger

  def testing do
    sport_color = "pink"

    case Ultraviolet.new(sport_color) do
      {:error, m} -> Logger.error("should_not_happen", reason: m)
      {:ok, color} -> color
    end
  end
end

error :

lib/my_module.ex:9:pattern_match
The pattern can never match the type.

Pattern:
{:ok, _color}

Type:
{:error, _}

________________________________________________________________________________
done (warnings were emitted)
Halting VM with exit status 2

Here’s a repository where I can reproduce the issue:

The warning doesn’t really make much sense to me, as I’ve used Color.new() in a variety of tests without encountering error cases, so I don’t know why dialyzer would see no path forward but the error case for a case I’ve definitely tested. Regardless, I’ve been working at this for a few hours now and I can’t seem to resolve this issue. Here’s what I’ve tried so far:

  • fixing all the dialyzer warnings / errors in Ultraviolet. While the published version still has warnings, the main branch does not. I’ve edited mix.exs on the example repository to point to my local copy with all the warnings resolved.
  • expanded the metaprogramming construct I use to generate function signatures for the W3CX11 named colors.
  • overriding the function to force a return type of {:ok, %Color{}} in an attempt to get something working.

None of these seem to work. Does anyone have any suggestions for how I might solve this problem? Thanks!

Marked As Solved

dcrck

dcrck

Okay, this took an embarrassingly long time to figure out, but since I was debugging the issue with the local version of my library, dialyzer did not even check for code changes to update the PLT (see this dialixir issue)! You need to use the --force-check argument in this case, i.e. mix dialyzer --force-check That should update the PLT accordingly. (TIL)

Now the checks pass without any issues. :sweat_smile:

Also Liked

LostKobrakai

LostKobrakai

Dialyzer doesn‘t care for what happens when the code actually runs. It cannot run it. It just cares for inferred types and how manual specs improve them.

You‘d want to figure out where dialyzer goes of the rails. One of its problems is that it will report the violation at a higher place in a callstack than where the source of the problem is. E.g. some of the helper functions to construct a color might have type inferred or speced wrongly.

dcrck

dcrck

I think that particular error is due to the presence of a check for the optional Jason dependency to generate the proper function signatures at compile time (See lib/ultraviolet/color_brewer.ex). Future versions of the library will require 1.18 and use the built-in JSON parser introduced in that release, so this warning should go away.

Where Next?

Popular in Questions Top

srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
gonzofish
I’m currently trying to understand how to join three tables using Ecto. All the examples I’ve seen use 2, so maybe I’m just missing somet...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New

Other popular topics Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
sergio
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New

We're in Beta

About us Mission Statement