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"