Elixir
のコードサンプル等に良く出てくるのだが、いまひとつ理解できないので覚え書き。
Enum.map(数値, fn(引数)-> IO.puts 引数 end)
数値を引数に実行するとどうやら、引数は配列でなければならないようだ。
iex(1)> Enum.map(2, fn(x)-> IO.puts x end)
** (Protocol.UndefinedError) protocol Enumerable not implemented for 2
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:112: Enumerable.reduce/3
(elixir) lib/enum.ex:1400: Enum.reduce/3
(elixir) lib/enum.ex:1047: Enum.map/2
Enum.map(文字列, fn(引数)-> IO.puts 引数 end)
実行するまでもないが・・・
エラー。
iex(1)> Enum.map("Hello",fn(x)-> IO.puts x end)
** (Protocol.UndefinedError) protocol Enumerable not implemented for "Hello"
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:112: Enumerable.reduce/3
(elixir) lib/enum.ex:1400: Enum.reduce/3
(elixir) lib/enum.ex:1047: Enum.map/2
Enum.map(配列, fn(引数)-> IO.puts 引数 end) で実行するとOK。
iex(1)> Enum.map([2], fn(x)-> IO.puts x end)
2
[:ok]
当然以下は想定通り。
iex(2)> Enum.map([1,2,3,4,5], fn(x)-> IO.puts x end)
1
2
3
4
5
[:ok, :ok, :ok, :ok, :ok]
Enum.map(文字列の配列, fn(引数)-> IO.puts 引数 end)
次に文字列配列。当然実行可能。
iex(3)> Enum.map(["Apple","Banana","Orange"],fn(x)-> IO.puts x end)
Apple
Banana
Orange
[:ok, :ok, :ok]
Enum.map(マップ, fn(引数)-> IO.puts 引数 end)
無名関数の引数の形式を変えて実行すると想定通りの結果。
iex(4)> Enum.map(%{a: "Apple", b: "Banana", c: "Orange"}, fn{key, val} -> IO.puts val end)
Apple
Banana
Orange
[:ok, :ok, :ok]
まだまだ、直感でプログラムするには、手を動かして覚えることが多いです。関数型プログラミング。