functional

programming

with Elixir

So, what's all about Elixir?

So, what's all about Erlang?

Concurrent

Distributed

Fault-tolerant

Hot swapping

Highly available

Then, why Elixir?

New generations

Done for web

Ruby-like

Extensibility

Tooling

Compiled to BEAM

Erlang-powered

Talk is cheap

Show me the code

Immutability


my_mutable_values = [10]

class MyClass
  def self.please_dont_modify_this(values)
    # Do stuff
    values.push(rand(10))
    # Do more stuff
  end
end

MyClass.please_dont_modify_this(my_mutable_values)
my_mutable_values # => [10, ???]
        

Immutability


my_immutable_values = [10]

defmodule MyModule do
  def please_dont_modify_this(values) do
    # Do stuff
    values = [ :rand.uniform(10) | values]
    # Do more stuff
  end
end

MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
        

Immutability


my_immutable_values = [10, 20, 30, 40, 50]

defmodule MyModule do
  def please_dont_modify_this(values) do
    # Do stuff
    other_values = [ :rand.uniform(10) | values]
    # Do more stuff
  end
end

MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
        

Immutability


my_immutable_values = [10, 20, 30, 40, 50]

defmodule MyModule do
  def please_dont_modify_this(values) do
    # Do stuff
    # Uses random value as head and `values` as tail
    other_values = [ :rand.uniform(10) | values]
    # Do more stuff
  end
end

MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
        

Pattern Matching ( = )

iex(1)> a = "hola"
"hola"




        

Pattern Matching ( = )

iex(1)> a = "hola"
"hola"
iex(2)> "hola" = a
"hola"


        

Pattern Matching ( = )

iex(1)> a = "hola"
"hola"
iex(2)> "hola" = a
"hola"
iex(3)> "hello" = a
** (MatchError) no match of right hand side value: "hola"
        

Pattern Matching ( = )

iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [a, b, c] = list
[1, 2, 3]






Pattern Matching ( = )

iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [a, b, c] = list
[1, 2, 3]
iex(3)> a
1
iex(4)> b
2
iex(5)> c
3

Pattern Matching ( = )

iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]




Pattern Matching ( = )

iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]
iex(3)> [wont_match, 2, 4] = list
** (MatchError) no match of right hand side value: [1,2,3]


Pattern Matching ( = )

iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]
iex(3)> [maybe_match, 2, 4] = list
** (MatchError) no match of right hand side value: [1,2,3]
iex(3)> [maybe_match, 2, _] = list
[1, 2, 3]

Functions

defmodule Calc do
  def add(x, y), do: x + y
end
Calc.add(2,3) # 5

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(n) do
    if(1 == n) do
      1
    else
      n + sum(n-1)
    end
  end
end
Calc.sum(5) # 15

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(1), do: 1
  def sum(n), do: n + sum(n-1)
end
Calc.sum(5) # 15

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(1), do: 1
  def sum(n), do: n + sum(n-1)
end
Calc.sum(-1) # looping forever

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(n) do
    if(n == 1) do
      1
    else
      if(n > 1) do
        n + sum(n-1)
      end
    end
  end
end
Calc.sum(-1) # nil

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(1), do: 1
  def sum(n) when n > 0, do: n + sum(n-1)
end
Calc.sum(-1) # no function clause matching in Calc.sum/1

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(1), do: 1
  def sum(n) when n > 0, do: n + sum(n-1)
end
Calc.sum([3, 5, 7]) # no function clause matching in Calc.sum/1

Functions

defmodule Calc do
  def add(x, y), do: x + y

  def sum(1), do: 1
  def sum(n) when is_integer(n) and n > 0, do: n + sum(n-1)
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum(7) # 28
Calc.sum([3, 5, 7]) # 15

Lists and Recursion

[ head | tail ]

Lists and Recursion

[] # []



Lists and Recursion

[] # []
[3] # [3 | []]


Lists and Recursion

[] # []
[3] # [3 | []]
[3, 2] # [3 | [2 | []]]

Lists and Recursion

[] # []
[3] # [3 | []]
[3, 2] # [3 | [2 | []]]
[3, 2, 1] # [3 | [2 | [1 | []]]]

Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])





Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])




Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])



Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])


Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])
# 3 + 5 + 7 + 0

Lists and Recursion

defmodule Calc do
  def sum([]), do: 0
  def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7]) # 15
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])
# 3 + 5 + 7 + 0

Give me moar elixir

elixirschool.com

Zero to Hero in Elixir

github.com/h4cc/awesome-elixir

Questions?

alagos.github.io/elixir-talk

github.com/alagos

@nomesigaporfa