こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はElixirの教科書『プログラミングElixir』第5章を読んで、学んだことをまとめます。1
目次
実行環境
- ・Windows 11 Home(バージョン 21H2, OS ビルド 22000.613)
- ・Ubuntu v18.04 ※WSL2環境下
- ・Elixir v1.13.0 (compiled with Erlang/OTP 24) ※WSL2環境下
- ・Phoenix v1.6.7 ※WSL2環境下
- ・psql (PostgreSQL) 10.19 ※WSL2環境下
以下私が詰まった箇所です。それ以外は本書か
Elixir公式の学習ページか、Elixir Schoolかで、学ぶことができます。
5.1 関数とパターンマッチ
iex()> sum = fn (a, b) -> a + b end
#Function<43.65746770/2 in :erl_eval.expr/5>
iex()> sum.(1, 2) #ドットの付け忘れに注意
3
無名関数の略記
iex()> sum2 = &(&1 + &2) #&1, &2 が第一引数、第二引数
&:erlang.+/2
iex()> sum2.(2, 3)
5
P43 練習問題より
list_concat.([:a, :b], [:c, :d]) #=> [:a, :b, :c, :d]
(意訳)
「要素が[:a, :b]であるリスト1と、要素が[:c, :d]であるリスト2を連結して、実行結果が[:a, :b, :c, :d]となるような、list_concatという名前の関数を作成せよ」
※:a, :b, :c, :dはいずれもアトムである。
私の回答↓
iex()> list_concat = fn ([:a, :b], [:c, :d]) -> [:a, :b, :c, :d] end
#Function<43.65746770/2 in :erl_eval.expr/5>
iex()> list_concat.([:a, :b], [:c, :d])
[:a, :b, :c, :d]
- ・concatとは、concatenation(連結)の略記。
- ・#=> とは、「実行結果」の意味。
- ・arityとは、引数の個数のこと。
- ・argumentとは、実引数のこと。
- ・#=> とは、「実行結果」の意味。
5.2 一つの関数、複数のボディ
特筆すべき箇所なし
5.3 関数は関数を返すことができる
パラメタライズされた関数
関数の入れ子について
iex()> add_n = fn n -> (fn other -> n + other end) end
#Function<44.65746770/1 in :erl_eval.expr/5>
#書き換えると
add_n = fn n ->
fn other ->
n + other
end
end
上記の関数に1つ目の引数2をnに束縛する。変数には最後の結果だけが束縛されるという点がポイント。
iex()> add_two = add_n.(2) #add_n.(2) = fn other -> 2 + other
#Function<44.65746770/1 in :erl_eval.expr/5>
#書き換えると
add_two = add_n.(2) ->
fn 2 ->
fn other ->
2 + other
end
end
end
#さらに書き換えると、
add_two =
# add_n.(2)の呼び出し結果
fn other -> 2 + other end
上記の関数に2つ目の引数3をotherに束縛する。
iex()> add_two.(3)
5
#書き換えると
add_two(3) = add_n.(2).(3) ->
fn 2 ->
fn 3 ->
2 + 3
end
end
end
#さらに書き換えると、
add_two(3) =
fn 3 -> 2 + 3 end
5.4 関数を引数として渡す
これも同様に、変数には最後の結果だけが束縛されるという点がポイント。
iex()> times_2 = fn n -> n * 2 end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex()> apply = fn (fun, value) -> fun.(value) end
#Function<43.65746770/2 in :erl_eval.expr/5>
iex()> apply.(times_2, 6)
12
#書き換えると
apply.(times_2, 6) = fn ( fun = times_2 , 6) -> fun.(6)
= fun.(6)
= times_2(6)
#=> 12
5.5 関数はElixirの中核だ
特筆すべき箇所なし
~Elixirの国のご案内~
※Elixirって何ぞや?と思ったらこちらもどぞ。未来がぎゅっと詰まった、Elixirは今年で生まれて10周年です
We Are The Alchemists, my friends!4
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽に話しかけてみてください。5
-
プログラミングが完全未経験ゆえ、「え?!そこからつまずく?!!」というお見苦しい箇所があるかと思いますが、私自身の記録のために残します。ご了承ください。 ↩
-
argument とは: https://e-words.jp/w/%E5%BC%95%E6%95%B0.html ↩
-
#=> とは: https://docs.ruby-lang.org/ja/latest/doc/symref.html ↩
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩