TIL: Elixir pattern matching for argument equality

matching

Pattern matching and guard expressions are fundamental to writing recursive function definitions in Elixir. Sometimes guard clauses and pattern matching can be used for the same purpose. For example:

# pattern matching
defmodule Exponent do
  def power(value, 0), do: 1
  def power(value, n), do: value * power(value, n - 1)
end

# guard expression
defmodule Exponent do
  def power(value, n) when n == 0, do: 1
  def power(value, n), do: value * power(value, n - 1)
end

In both cases above, we only want the first power function to run when the second argument is equal to 0. When it is as simple as equality, I tend to use the pattern matching syntax. I typically leave the guard for more complex logic like when rem(x, divisor) == 0. However, to check whether one argument is equal to another I thought a guard was neccessary: when a == b. But, today I learned, this can also be handled with pattern matching, like so:

# guard
def equality(a, b) when a == b, do: IO.puts "equal"
def equality(a, b), do: IO.puts "not equal"

# pattern matching
def equality(a, a), do: IO.puts "equal"
def equality(a, b), do: IO.puts "not equal"

Tada! There you have it. It seems so simple I don’t know how I hadn’t tried it earlier!

Newsletter

Stay in the Know

Get the latest news and insights on Elixir, Phoenix, machine learning, product strategy, and more—delivered straight to your inbox.

Narwin holding a press release sheet while opening the DockYard brand kit box