LoginSignup
3
2

More than 5 years have passed since last update.

Elixir~Enum総ざらい2回目~

Last updated at Posted at 2019-02-17

ここまでのあらまし

Elixir~Enumまつり1回目~Enum.chunk_every、Enum.all?、Enum.any?、Enum.at~
からはじめたように、Elixir公式ドキュメント のEnumを総ざらいして、理解を深めていくことにします。
"Elixirでシンセサイザーをつくる"というわたしの中長期的目標のため、音楽的なメタファーが思いつくものは解説に付与します。
法則性がわからない関数に関してはその旨を記載します。
おおむね一週間弱ですべてのEnum関数を洗うのが目標です。

Enum.at

Enum.at([2, 4, 6], 0)
2

 Enum.at([2, 4, 6], 2)
6

Enum.at([2, 4, 6], 4)
nil

どうやらこれは、ゼロを起点にして(not1)、リストのn番目の値を返してくれる関数のようです。

Enum.chunk_every

Enum.chunk_every([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]

 Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, :discard)
[[1, 2, 3], [3, 4, 5]]

 Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, [7])
[[1, 2, 3], [3, 4, 5], [5, 6, 7]]

Enum.chunk_every([1, 2, 3, 4], 3, 3, [])
[[1, 2, 3], [4]]

 Enum.chunk_every([1, 2, 3, 4], 10)
[[1, 2, 3, 4]]

Enum.chunk_every([1, 2, 3, 4, 5], 2, 3, [])
[[1, 2], [4, 5]]

一番上に関しては、リスト内の数字を2つごとに分けて出力しているように思います。
その下になっていくと法則性が徐々に分からなくなっていきます。

Enum.chunk_while

chunk_fun = fn item, acc ->
...>   if rem(item, 2) == 0 do
...>     {:cont, Enum.reverse([item | acc]), []}
...>   else
...>     {:cont, [item | acc]}
...>   end
...> end
iex> after_fun = fn
...>   [] -> {:cont, []}
...>   acc -> {:cont, Enum.reverse(acc), []}
...> end
iex> Enum.chunk_while(1..10, [], chunk_fun, after_fun)
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

全く分かりません。飛ばします。

Enum.concat


Enum.concat([1..3,4..6,7..9])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Enum.concat([[1, [2], 3], [4], [5, 6]])   
[1, [2], 3, 4, 5, 6]
Enum.concat([[1, [2], 3],[ [4], [5, 6]]])
[1, [2], 3, [4], [5, 6]]
Enum.concat(1..3, 4..6)
[1, 2, 3, 4, 5, 6]
 Enum.concat([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]

リストのなかの数字を連番で出力、特別ひとつだけ[]で囲ってある要素だけ[]で囲って出力しているように思います。

Enum.count

Enum.count([1, 2, 3])
3

これは簡単なようです。リストの中にある要素の数をあわせて出力しているようです。

Enum.count([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end)
2

これは割ったらあまりがゼロになる要素の数として2を返しているようです。
(最初わからなかった...)

Enum.dedup

Enum.dedup([1, 2, 3, 3, 2, 1])
[1, 2, 3, 2, 1]

Enum.dedup([1, 1, 2, 2.0, :three, :three])
[1, 2, 2.0, :three]

リストの要素のなかで、重複するものを削って出力しているようです。

dedup_by

Enum.dedup_by([{1, :a}, {2, :b}, {2, :c}, {1, :a}], fn {x, _} -> x end)
[{1, :a}, {2, :b}, {1, :a}]

iex> Enum.dedup_by([5, 1, 2, 3, 2, 1], fn x -> x > 2 end)
[5, 1, 3, 2]

これもわかるようで法則性がわかりません...。

ここまで

きょうはここまで!
いままで派手で注目に値する関数ばかり記事にしていたので、なかなか音楽的なメタファー(これは先生からの指令です)を入れ込むことが難しいですね、、
うまずたゆまず、頑張ります。
Kento Mizuno

3
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2