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
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m aware of 2 such projects, are there others?
git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
Hi everyone.
My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
Hello folks!
So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Hi,
we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
Hi all, I’m new here and would like to hear peoples views on my Elixir/Phoenix based game-engine! :smiley:
Mutonex gamedesign was finish...
New
Other Trending Topics
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself.
My main conc...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #hex











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