Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@kmizuno0211

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

これまでのあらまし

わたしは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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?