Does dialyzer let you simplify code?

I’m still in the beginning phases of Elixir. I come from a Java background, where I tried incorporating functional concepts as often as possible. I’m therefore very interested in using Dialyzer, and hopefully I can get the hang of product/sum types for domain modeling.

My question is this: does using Dialyzer allow you to code Elixir differently? For example, would my code require fewer pattern matches?

Short answer: no

Longer answer: It might spot some type errors which allows you to improve the code. But Dialyzer itself does not ‘change’ code. All it does is check specifications (‘@spec’) and guesses types when specs are not provided. Dialyzer has nothing to do with runtime, nor with optimizing code.

Afaik typing (and so specs) are used by Erlang compiler to optimize some code. See the changelog of Erlang 24 and 25.

My 2ct: the specs are cool when you use a library; makes it easy to see what is expected. When you have to read code they add a lot of clutter; especially for small functions.

Note to self: find plugin or theme for Emacs that hides them

The most significant overlap between Dialyzer and pattern-matching is that it will detect patterns that can never match. For instance, if you have code like this:

case some_function(arg1, arg2, arg3) do
  {:ok, something} ->
    # do things
  {:error, etc} ->
    # do different things
end

If Dialyzer can prove that some_function will never successfully return {:ok, something}, it will report an error.

Require? No. It might tell you when you have unnecessary cases though.

Coming from a statically typed language, things like typespecs + Dialyzer warnings might make you feel more at home though.

I honestly wish Elixir could have some gradual typing system that stops compilation if typespecs don’t add up.