I understand pattern matching in a very basic sense.
So for example I understand perfectly well what this code does
%{william: age} = %{william: 40 }
IO.inspect age # 40
{a, b} = {100, 200}
IO.inspect a # 100
IO.inspect b # 200
What I am having trouble understanding is function behavior when named functions with the same name and arity take precedence over one another based on argument type
So for example, the following code is an implementation of a len function and it returns the length of a list. For the most part I understand how it works ( I think ). The two functions allow for behavior usually reserved for conditional statements. If the array is empty then the recursion is terminated
defmodule Mylist do
def len(), do: 0
def len([head|tail]), do: 1 + len(tail)
end
IO.inspect Mylist.len([5, 4, 3, 2, 1]) # 5
The previous functions only work if the argument type is a list. If I did the following I get an error:
IO.inspect Mylist.len(“blah”) # no function clause matching in Mylist.len/1
Based on this, I assume there is a way to write functions that only respond to inputs that are of type number or string. Is this possible without using conditional statements?