同じアリティ(arity、引数の数)の関数を多重に定義するとき、Erlangでは以下の構文を使います。
erlang
1関数名(引数パターン1) ->
2 式; %% セミコロンで終わる
3関数名(引数パターン2) ->
4 式;
5関数名(_) ->
6 式. %% ピリオドで終わる
ですからご質問のコードもそのように変更するとコンパイルできるようになります。(元のコードはX + Y
と(除算ではなく)加算になってますが、そのまま残しています)
erlang
1-module(ex2).
2-export([my_div/2]).
3
4my_div(X, Y) ->
5 X + Y; %% セミコロンに変更しました。
6my_div(_, 0) ->
7 'error'.
ただし、引数パターンは上から評価されるので順番が大切です。上のコードですと意図したとおりに動きません。
erl
1$ erl
21> c(ex2).
3ex2.erl:6:1: Warning: this clause for my_div/2 cannot match because a previous clause at line 4 always matches
4% 6| my_div(_,0) ->
5% | ^
6
7{ok,ex2}
8
92> ex2:my_div(10, 0).
1010 %% errorが返らない
ex2:my_div(10, 0).
としてもerror
は返りません。c(ex2)
のところで警告が出ています。警告の内容は、前の項(my_div(X, Y)
)が常にマッチするするので、my_div(_,0)
にマッチすることがない、というものです。
以下のように項の順番を入れ替えると解決します。
erlang
1-module(ex2).
2-export([my_div/2]).
3
4my_div(_, 0) ->
5 'error';
6my_div(X, Y) ->
7 X + Y.
erl
1$ erl
21> c(ex2).
3{ok,ex2}
4
52> ex2:my_div(10, 0).
6error
関数の定義の仕方が悪いのはわかるのですが、書き方がわかりません。。。
たぶんそもそもの基礎が備わっていませんが、調べてもでてこないのでこちらで質問してみました。
英語ですが、関数の構文については、こちらのオンラインブックで解説されています。
そのオンラインブックは、その後、紙の本として出版されました。
オーム社から和訳本も出ています。
すごいErlangゆかいに学ぼう!
追記
こちらのサイトも良さそうです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/25 11:07
2021/12/26 00:14