未経験文系初学者 Elixirを学ぶ 『プログラミングElixir』-第5章

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はElixirの教科書[『プログラミングElixir』](https://www.ohmsha.co.jp/book/9784274226373/)第5章を読んで、学んだことをまとめます。[^0]

#### 目次
[第4章へはこちらから](https://qiita.com/Alicesky2127/items/804c41110b0033fb7770)
## 

## 実行環境
<dl>
  <dd>・Windows 11 Home(バージョン 21H2, OS ビルド 22000.613)</dd>
  <dd>・Ubuntu v18.04 ※WSL2環境下</dd>
  <dd>・Elixir v1.13.0 (compiled with Erlang/OTP 24) ※WSL2環境下</dd>
  <dd>・Phoenix v1.6.7 ※WSL2環境下</dd>
  <dd>・psql (PostgreSQL) 10.19 ※WSL2環境下</dd>
</dl>



以下私が詰まった箇所です。それ以外は本書か
[Elixir公式の学習ページ](https://elixir-lang.org/getting-started/basic-types.html#linked-lists)か、[Elixir School](https://elixirschool.com/ja/lessons/basics/basics)かで、学ぶことができます。


## 5.1　関数とパターンマッチ
```elixir
iex()> sum = fn (a, b) -> a + b end
#Function<43.65746770/2 in :erl_eval.expr/5>

iex()> sum.(1, 2) #ドットの付け忘れに注意
3
```

無名関数の略記

```elixir
iex()> sum2 = &(&1 + &2) #&1, &2 が第一引数、第二引数
&:erlang.+/2

iex()> sum2.(2, 3)
5
```

#### P43 練習問題より
```elixir
list_concat.([:a, :b], [:c, :d]) #=> [:a, :b, :c, :d]
```
（意訳）
「要素が[:a, :b]であるリスト１と、要素が[:c, :d]であるリスト２を連結して、実行結果が[:a, :b, :c, :d]となるような、list_concatという名前の関数を作成せよ」
※:a, :b, :c, :dはいずれもアトムである。


私の回答↓
```elixir
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]
```

(練習問題でつまづいた箇所)[^2] [^3]
<dl>
  <dd>・concatとは、concatenation(連結）の略記。
  <dd>・#=> とは、「実行結果」の意味。
  <dd>・arityとは、引数の個数のこと。
  <dd>・argumentとは、実引数のこと。
</dl>


## 5.2　一つの関数、複数のボディ
特筆すべき箇所なし

## 5.3　関数は関数を返すことができる
#### パラメタライズされた関数

関数の入れ子について
```elixir
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に束縛する。変数には最後の結果だけが束縛されるという点がポイント。

```elixir
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に束縛する。

```elixir
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　関数を引数として渡す
これも同様に、変数には最後の結果だけが束縛されるという点がポイント。

```elixir
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の中核だ
特筆すべき箇所なし



<br>

# ～Elixirの国のご案内～
※Elixirって何ぞや？と思ったらこちらもどぞ。未来がぎゅっと詰まった、Elixirは今年で生まれて10周年です:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/7bf8f9f4f5f576e597f5



[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^9]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。


まずは気軽に話しかけてみてください。[^10]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian






[^0]:プログラミングが完全未経験ゆえ、「え？！そこからつまずく？！！」というお見苦しい箇所があるかと思いますが、私自身の記録のために残します。ご了承ください。

[^1]: 他言語（特にRuby)に存在する語句を知ってる前提で来るのは初学者には結構キツイ...ググればいいけどもググった先の単語でまた不明単語が出る。ググってばかりで日が暮れてしまう...(T_T)

[^2]: argument とは: https://e-words.jp/w/%E5%BC%95%E6%95%B0.html

[^3]: #=> とは: https://docs.ruby-lang.org/ja/latest/doc/symref.html

[^9]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

[^10]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！