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