Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Elixirの内包表記、内包してなくない問題

1から10まで、各数字を2乗して足すプログラムを考えます。

1..10
|> Enum.map(&(&1*&1))
|> Enum.reduce(&(&1+&2))
|> IO.inspect

こうなります。分かりやすいですね。

それが「内包表記」だと以下のように書けます

for i <- 1..10 do
  i*i
end
|> Enum.reduce(&(&1+&2))
|> IO.inspect

(for i <- 1..10, do: i*i)
|> Enum.reduce(&(&1+&2))
|> IO.inspect

どこが「内包」なんじゃい!!

カッコで囲ってないくせに内包ってなんじゃいな!!!

そもそも内包とは?

と、ココまで書いてから「そもそも内包ってなんなんだ?」と思い調べてみました。内包というのは、[]で包まれていることではなく、数学の用語の一つだそうです。

                                  終
                         --------------------
                           制作・著作 NHK

…もうちょっとだけ説明しますね。

数学で集合を定義するとき、「集合に含まれる要素をすべて列挙するやり方」と「集合に含まれる要素が満たすべき条件を定めることで定義するやり方」があります。後者を内包というそうです。

例えば、1から10それぞれの二乗という集合は、Elixirの内包表記ではつぎのようになります。

for i <- 1..10, do: i*i

数学で内包で書くとこのような集合になります。

\{x|i \in \{1,2,\cdots,10\},x=i^2\}

Elixirの内包表記は数式そのまんまだったことがわかりました。まさに「内包」表記です。