LoginSignup
14
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-01

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はElixirの教科書『プログラミングElixir』第5章を読んで、学んだことをまとめます。1

目次

第4章へはこちらから

実行環境

・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]

(練習問題でつまづいた箇所)2 3

・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周年です:laughing::sparkles::sparkles:

We Are The Alchemists, my friends!:bouquet:4
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。

まずは気軽に話しかけてみてください。5

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

  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

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

  5. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

14
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
0