Elixir 練習問題 Functions-4

Elixir では、関数を返す関数を書くことができる。しかも、返ってくる関数はそれが定義された元の環境を覚えている。つまりクロージャだ。
というわけで、練習問題をやってみよう。

iex(1)> prefix = fn a -> (fn b -> a <> " " <> b end) end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(2)> mrs = prefix.("Mrs")
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(3)> mrs.("Smith")
"Mrs Smith"
iex(4)> prefix.("Elixir").("Rocks")
"Elixir Rocks"

Elixir 練習問題 Functions-3

iex(1)> fizzbuzz = fn
...(1)>   0, 0, _ -> "FizzBuzz"
...(1)>   0, _, _ -> "Fizz"
...(1)>   _, 0, _ -> "Buzz"
...(1)>   _, _, n -> n
...(1)> end
#Function<18.52032458/3 in :erl_eval.expr/5>
iex(6)> fizzbuzz2 = fn n -> fizzbuzz.(rem(n, 3), rem(n, 5), n) end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(7)> fizzbuzz2.(10)
"Buzz"
iex(8)> fizzbuzz2.(11)
11
iex(9)> fizzbuzz2.(12)
"Fizz"
iex(10)> fizzbuzz2.(13)
13
iex(11)> fizzbuzz2.(14)
14
iex(12)> fizzbuzz2.(15)
"FizzBuzz"
iex(13)> fizzbuzz2.(16)
16

Elixir 練習問題 Functions-2

iex(1)> fizzbuzz = fn
...(1)>   0, 0, _ -> "FizzBuzz"
...(1)>   0, _, _ -> "Fizz"
...(1)>   _, 0, _ -> "Buzz"
...(1)>   _, _, n -> n
...(1)> end
#Function<18.52032458/3 in :erl_eval.expr/5>
iex(2)> fizzbuzz.(0, 0, 15)
"FizzBuzz"
iex(3)> fizzbuzz.(0, 3, 3)
"Fizz"
iex(4)> fizzbuzz.(2, 0, 5)
"Buzz"
iex(5)> fizzbuzz.(1, 1, 1)
1

Elixir 練習問題 Functions-1

「プログラミングElixir」、第I部を読み終わった。これから少しずつアウトプットしていこう。
とりあえずは、第5章 無名関数 の練習問題から、関数を3つ(list_concat, sum, pair_tuple_to_list)作れ、と。

まずは list_concat

iex(1)> list_concat = fn l1, l2 -> l1 ++ l2 end
#Function<12.52032458/2 in :erl_eval.expr/5>
iex(2)> list_concat.([:a, :b], [:c, :d])
[:a, :b, :c, :d]

次に sum

iex(3)> sum = fn a, b, c -> a + b + c end
#Function<18.52032458/3 in :erl_eval.expr/5>
iex(4)> sum.(1, 2, 3)
6

最後に pair_tuple_to_list

iex(5)> pair_tuple_to_list = fn {a, b} -> [a, b] end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(6)> pair_tuple_to_list.( {1234, 5678} )
[1234, 5678]