内包表記

Elixir には Haskell や Python のようにリスト内包表記がある。

 cf. 18 内包表記 – Comprehensions – Elixir

iex(1)> for n <- [1, 2, 3, 4], do: n * n
[1, 4, 9, 16]

生成器とフィルタ

上の式で n <- [1, 2, 3, 4] が生成器だ。列挙可能なものなら何でも生成器の右の式に入れられる。

iex(2)> for n <- 1..4, do: n * n
[1, 4, 9, 16]

生成器はパターンマッチングに対応していて、パターンにマッチしない値は無視する。次の例では、キーワードリストからキーが :good の値だけを生成している。

iex(3)> values = [good: 1, good: 2, bad: 3, good: 4]
[good: 1, good: 2, bad: 3, good: 4]
iex(4)> for {:good, n} <- values, do: n * n
[1, 4, 16]

生成器に続けてフィルタを書くと、フィルタを通った値だけが残る。次の例は奇数だけがフィルタを通り、2乗を生成する。

iex(5)> require Integer
Integer
iex(6)> for n <- 1..4, Integer.is_odd(n), do: n * n
[1, 9]

Bitstring生成器

ビットストリングを生成することもできる。

iex(7)> pixels = <<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>>
<<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>>
iex(8)> for <<r::8, g::8, b::8 <- pixels>>, do: {r, g, b}
[{213, 45, 132}, {64, 76, 32}, {76, 0, 0}, {234, 32, 15}]

into

通常、内包表記はリストを返す。けれど :into オプションを使うことで、結果を別の型に挿入することができる。次の例は、Bitstring 生成器と :into オプションを使って、文字列から空白文字を取り除いている。

iex(9)> for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
"helloworld"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください