Slide 30
Slide 30 text
Julia の イテレータ
struct FibSequence end;
Base.iterate(itr::FibSequence) = iterate(itr, (0, 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 と
同じ仕組みに実はなっている