LoginSignup
4
2

More than 5 years have passed since last update.

Elixir~Enumまつり1回目~Enum.chunk_every、Enum.all?、Enum.any?、Enum.at~

Last updated at Posted at 2019-02-17

これまでのあらまし

わたしはJavaシルバー本100ページ程度の知識しかないプログラミング超初学者です。
学習効率とノリ(めちゃくちゃ失礼な本音かもしれませんが...)でElixirを選びました。
現在、Enum関数とパイプライン演算子を用いた式の書き方を猛勉強しています。

また、わたし自身音楽家であることから、"ELixirでシンセサイザーをつくる"ことを目標にしています。その見地から理解した式を音楽に例えていく芸風で記事を連ねていくことにしました。

公式ドキュメント(英語) から、ひたすらEnumの関数を上から解いてみて、理解を記していきます。

Enum.chunk_every

iex> Enum.chunk_every(1..100,3)
[
  [1, 2, 3],
  [4, 5, 6],
  '\a\b\t',
  '\n\v\f', 
  [13, 14, 15],
  [16, 17, 18],
  [19, 20, 21],
  [22, 23, 24],
  [25, 26, 27],
  [28, 29, 30],
  [31, 32, 33],
  '"#$',
  '%&\'',
  '()*',
  '+,-',
  './0',
  '123',
  '456',
  '789',
  ':;<',
  '=>?',
  '@AB',
  'CDE',
  'FGH',
  'IJK',
  'LMN',
  'OPQ',
  'RST',
  'UVW',
  'XYZ', 
  '[\\]',
  '^_`',
  'abc',
  'd'
]

この式は、"1から100のリストを3個の整数ごとにまとめて出力する"式です。
途中記号や文字化けが入っているのは残念ながら仕様だそうです。

音楽に例えるとしたら、シンセサイザーからずっと流れているオシレーターの波形を一定周期でサンプリングを取り続けるみたいなイメージかと思います。

パイプライン演算子と&記法を用いてこう書き換えることができました。

1..100 |> Enum.chunk_every(3)

Enum.all?

iex>Enum.all?([2, 4, 6], fn x -> rem(x, 2) == 0 end)
true

これは、リストの中の数字を2で割ってあまりが全てゼロならtrueを返す、という構文のようです。

iex>[2, 4, 6] |> Enum.all?(& rem(&1, 2) == 0)

パイプライン演算子と&記法を用いてこう書き換えることもできました。


1..10 |> Enum.all?(& rem(&1, 2) == 0)
false

これは奇数があるので当然falseになりますね。

というわけで、Enum.all?は"条件に対してすべて符号する場合はtrueを返す"関数のようです。
音楽のメタファーにするなら...閾値以下の波形をすべて叩いて無音にしてしまう"ゲート"というエフェクターでしょうか。

Enum.any?

iex>Enum.any?([2, 4, 6], fn x -> rem(x, 2) == 1 end)
false

ストの中にひとつでもあまりが1になる要素があればtrueを返す、という構文でしょうか。

Enum.any?([2,3,4], fn x -> rem(x, 2) ==1 end)
true

これはtrueになるので、"リストのなかにひとつでもあまりが1になる要素があればtrueを返す"、という仮定は合っているようです。

書き換え

[2, 3, 4] |> Enum.any?(& rem(&1, 2)==1)
true

Enum.at

iex(10)> Enum.at([2, 4, 6], 0)
2
iex(11)> Enum.at([2, 4, 6], 2)
6
iex(12)> Enum.at([2, 4, 6], 4)
nil

これは見ていくに、リストのなかの要素をゼロから数え始めて指定の番数の値を返す、という関数のようです。ちょっとMIDIシーケンサーでこんな機能がありそうな気がします。

というわけで、ひたすらEnumの公式ドキュメントを辿って得意な音楽のメタファーを使いながら自己理解を深めていきます。

うまずたゆまず、頑張ります。
Kento Mizuno

4
2
2

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
4
2