 
  
  defmodule Ex do def flatten([]), do: [] def flatten([h|t]), do: flatten(h) ++ flatten(t) def flatten(x), do: [x] end IO.inspect Ex.flatten [] # => [] IO.inspect Ex.flatten [1, 2, 3] # => [1, 2, 3] IO.inspect Ex.flatten [1, [2, [3], 4], 5] # => [1, 2, 3, 4, 5] 恥ずかしながら、なぜこの定義で良いのかずっと理解できなかったのです。 理解できないよりも先行して、なんか気持ち悪いのです。 この気持ち悪さを解消するため、 少し遠回りしながら初心に返り、flatten に歩み寄っていこうと思います。 再帰的に考える 関数型言語には普通、再代入可能
 
      
  defmodule Acc do def reverse(list), do: _reverse(list, []) defp _reverse([], acc), do: acc defp _reverse([h|t], acc), do: _reverse(t, [h|acc]) def map(list, fun), do: _map(list, fun, []) defp _map([], _fun, acc), do: reverse(acc) defp _map([h|t], fun, acc), do: _map(t, fun, [fun.(h)|acc]) def filter(list, pred), do: _filter(list, pred, []) defp _filter([], _pred, acc), do: reverse(acc) defp _filte
 
      
  リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く
