質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Erlang

Erlangとは、多目的でありガーベッジコレクションを行うプログラミング言語および実行環境です。Erlangは並行処理・分散化された環境・フォルトトレランスを実装しています。

Q&A

解決済

1回答

644閲覧

ゼロ除算のチェックを追加する

trymobuo

総合スコア38

Erlang

Erlangとは、多目的でありガーベッジコレクションを行うプログラミング言語および実行環境です。Erlangは並行処理・分散化された環境・フォルトトレランスを実装しています。

0グッド

0クリップ

投稿2021/12/24 00:38

初歩的な質問ですみません。
初めてまだ2日ほどなんですがゼロ除算ならエラーメッセージソースを作りたいです。

目的
ex2:my_div(10, 0).
を実行した時にゼロ除算ならエラーメッセージを返す

作成したファイル
ex2.erl

Erlang

1-module(ex2). 2-export([my_div/2]). 3 4my_div(X, Y) -> 5X + Y. 6 7my_div(_,0) -> 'error'.

上記のソースファイルを作成し、コンパイルしようとすると
function my_div/2 aleady defined とでます。
関数の定義の仕方が悪いのはわかるのですが、書き方がわかりません。。。
たぶんそもそもの基礎が備わっていませんが、調べてもでてこないのでこちらで質問してみました。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

同じアリティ(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 01:50

編集2021/12/25 02:01
tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trymobuo

2021/12/25 11:07

返信ありがとうございます! 解決することができました。 また参考になる書籍などもありがとうございます 本も早速購入することにしました。 ベストアンサーにさせていただきます。
tatsuya6502

2021/12/26 00:14

解決してよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問