Despite some niceties like union types, Dialyzer is pretty limited. For example, here is example of something I would expect to be able to express in a modern type system but is not possible with Dialyzer (as far as I know):<p><pre><code>    @spec foo[a: SomeProtocol &amp; SomeBehaviour](a, a) :: a
</code></pre>
I&#x27;ve also noticed that it lets through stuff that I would expect to fail to compile, so it&#x27;s hard to trust as I would a type system like Elm&#x27;s, Haskell&#x27;s or Rust&#x27;s. The Elixir devs have done a great job with the language, and it&#x27;s great to see the resurgence of interest in BEAM as a result, but I still really wish they had taken the opportunity to build in a decent type system...