zoten
Good morning everyone!
I’ve stumbled in a very strange, and probably trivial, error with dialyzer in a simple function, e.g.
defmodule DialyzerFp do
@spec has_put?(module()) :: true | no_return()
def has_put?(mod) do
with {:ensure, {:module, _}} <- {:ensure, Code.ensure_loaded(mod)},
{:implements, true} <-
{:implements, function_exported?(mod, :put, 3)} do
true
else
{:ensure, error} ->
raise "Module [#{inspect(mod)}] could not be loaded [#{inspect(error)}]"
{:implements, _} ->
raise "Module [#{inspect(mod)}] does not export put/3"
end
end
end
Calling mix.dialyzer on a project consisting of this module alone yields to
lib/dialyzer_fp.ex:9:pattern_match
The pattern can never match the type.
Pattern:
{:ensure, _error}
Type:
{:implements, false}
Fun part is that if I invert the branches in else, dialyzer inverts the error like
lib/dialyzer_fp.ex:10:pattern_match
The pattern can never match the type.
Pattern:
{:implements, _}
Type:
{:ensure, {:error, :badfile | :embedded | :nofile | :on_load_failure}}
Consider also:
- the function is working as expected in all 3 cases (both this and the original one)
- tried without typespecs
- tried using
atom,atom | module,any,is_atomguard
Does anyone have any hint on what could be going on?
Thanks, as always! ![]()
Trending in Questions
Hey guys,
I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly
Do you guys have any suggestions what is the best prac...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
Anyone here using Honeybadger?
My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of
Bandit.HTTPError...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
There are three potential reasons for members of this forum to have a look at https://vutuv.de
You are tired or annoyed of LinkedIn.
Yo...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixir-ls
- #ai
- #elixirconf-us
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 3- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
RudManusachi
Might be related to Dialyzer only taking one path in `with` statement · Issue #7177 · elixir-lang/elixir · GitHub
RudManusachi
I know it’s annoying especially if you require dialyzer pass in your CI.
Though, not the direct answer to the question, but I’d like to point out that pattern used in the example (tagging each expressions with an atom in a tuple to differentiate in “else”) is discouraged. (see here)
And would be better to take out each tagged expression into its own small function:
And with that code dialyzer shouldn’t get confused =)
zoten
Thanks for the hints!
)
You’re totally right in underlining how this is a discouraged practice (I personally allow “small else branches” in my code because I work well in seeing every outcome of certain functions in a single place and I don’t like to specialize otherwise generic functions in returning a certain form of output, but that’s on me and I can agree with the general concept)
Also, you’re right in saying that dialyzer is happier in dividing in different functions (fun enough, I have in the meanwhile solved this way but in the discourage errors handling part, shame on me
This solves the practical issue, but it bugs me not having understood the reason behind this behaviour