かなりすごいブログ

Rubyistが始めるElixir - フィボナッチ編

Ruby版

class Fib
  def self.fib n
    case n
    when 0 then 0
    when 1 then 1
    when 2..Float::INFINITY then fib(n - 1) + fib(n - 2)
    else raise TypeError, 'n'
    end
  end
end

puts Fib.fib 1
puts Fib.fib 3
puts Fib.fib 13

Rubyのcaseによるパターンマッチは強力ですね。

Elixir版

defmodule Fib do
  def fib 0 do 0 end
  def fib 1 do 1 end
  def fib(n) when (is_integer n) and (n > 0) do
    fib(n - 1) + fib(n - 2)
  end
end

IO.puts Fib.fib 1
IO.puts Fib.fib 3
IO.puts Fib.fib 13

メソッド引数のパターンマッチ・ガードがいい感じですね。

ただ、パターンガードで型制約はちょっと見栄えが微妙な感じもしますね。