3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

草莽Erlang ── 10. 関数

Last updated at Posted at 2023-01-07

口で言うより行うことがErlang習得への近道と信じています。

Erlangの関数

大きく分けて3種類あります。

  1. モジュールに定義された関数
  2. Erlangビルトイン関数(BIFs)
  3. 無名関数

モジュールに定義された関数

  • 基本的にModule:Function(Arguments) という形で呼び出す
  • モジュール内の関数、及び明示的にインポートされた関数は、モジュール名を省略して呼び出せる

一例としてioモジュールのformat/2関数を呼び出してみます。

> io:format(["闘魂", $\n]).
闘魂
ok

関数を宣言する方法

  • 関数はセミコロン(;)で区切られ、ピリオド(.)で終端する一連の関数節で構成される
  • 関数節は節頭と節胴体からなり,->で区切られる
  • 節頭は,関数名(アトム)、引数リスト(パターン)およびwhenで始まるガードからなる
  • 節胴体はカンマ(,)で区切られた一連の式で構成される
関数名(引数パターン1) [when ガード1] ->
  式11,
  式12;
関数名(引数パターンN) [when ガードN] ->
  式N1,
  式N2.

一例として階乗の関数は以下のように宣言します。

fact(N) when N > 0 ->  % 第一節 頭
  N * fact(N - 1);     % 第一節 胴体
                       % 節は「;」で区切る
fact(0) ->             % 第二節 頭
  1.                   % 第二節 胴体
                       % 終端は「.」

Erlangビルトイン関数(BIFs)

  • erlangモジュールに属している
  • 他の関数と違って、自動的にインポートされる
% モジュール名を省略できる
> hd([1, 2 ,3]).
1

% モジュール名を明示してもOK
> erlang:hd([1, 2 ,3]).
1

無名関数

  • fun ... end式で定義すること以外は、モジュールで定義する場合と同じ書き方
  • 変数に束縛して使用可能

まずは簡単なやつで練習してみます。

> Aisatsu = fun () -> io:put_chars("元気ですかーーーーッ!\n") end.

> Aisatsu().
元気ですかーーーーッ!
ok

階乗は無名関数で書くとこんな感じになります。再帰処理をするには引数に関数自身を渡す必要があります。

Fact = fun
  (Fact, N) when N > 0 ->  % 第一節 頭
    N * Fact(Fact, N - 1); % 第一節 胴体
                           % 節は「;」で区切る
  (Fact, 0) ->             % 第二節 頭
    1                      % 第二節 胴体
end.                       % 終端は「.」
> Fact(Fact, 2).
2
> Fact(Fact, 3).
6
> Fact(Fact, 4).
24

無名関数の中で無名関数を書くこともできます。

Factorial = fun (Number) ->
  Fun = fun
    (F, N) when N > 0 -> N * F(F, N - 1);                       
    (F, 0) -> 1                
  end, % 節胴体の式はカンマで区切る
  Fun(Fun, Number)                     
end. 

Module:Name/Arity記法

Module:Name/Arity記法を使ってモジュールに定義された関数と同じ振る舞いをする無名関数を生成することができます。

> MyFormat = fun io:format/2.
fun io:format/2

> MyFormat("~ts~n",["闘魂"]).
闘魂
ok

Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?