1)); function Base.iterate(::FibSequence, (a, b)) (a, (b, a + b)) end; collect(Iterators.takewhile(<(100), FibSequence())) #> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] #= # Elixir による類似例 defmodule Fibonacci do def sequence, do: Stream.unfold({0, 1}, fn {a, b} -> {a, {b, a + b}} end) end Stream.take_while(Fibonacci.sequence, &(&1 < 100)) |> Enum.to_list # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] =# • Base.iterate() をメソッド実装 (多重定義)することでイテレータを 定義できる ◦ 所謂 関数型言語 によくある unfold と 同じ仕組みに実はなっている