2016-11-25 3 views
1

私はを学習中です。、そして末尾再帰についての議論では、著者はtail_fac/1tail_fac/2の2つの関数を定義しています。この本は、tail_fac/1のみを輸出すると述べています。どのように関数を定義するのですか?この場合、tail_fac/2をエクスポートせずにどうしますか?関数を定義するために私が知っている唯一の方法は-export([func_name/args])です。関数をエクスポートせずに定義するにはどうすればいいですか?

私はコードスニペットを実行しよう:

tail_fac(N) -> tail_fac(N,1). 

tail_fac(0,Acc) -> Acc; 
tail_fac(N,Acc) when N > 0 -> tail_fac(N-1,N*Acc). 

私リンターはtail_fac/2私は輸出でそれを定義しようとした場合でも、未定義であることを述べています。

+0

最初の関数宣言の最後にドットを挿入しないでください。同名の関数はセミコロンで区切らなければなりません。 Erlangは、 "tail_fac"という名前の関数が1つしかないと考えています。 – Alex

+0

@Alex関数名は同じ名前で同じアリティを持つが、同じ名前と異なるアリティを持つ関数がドットで区切られている場合、関数節はセミコロンで区切らなければなりません。だから、このコードは私にとっては完璧に見えます。私はこのコードをコンパイルし、tail_fac/1をテストしました。それはそのまま正常に動作するようです。 –

+0

さて、私は間違っていた。 – Alex

答えて

4

実際には、常に-compile(export_all)を使用して、すべての機能をにエクスポートしますが、it's not a good practiceを使用することができます。

Ruby、Python、またはElixirでは、どのメソッド/関数を非公開にするかを明示的に指示する必要があります。 Erlangでは、あなたは同じことをしていますが、公的な機能を持っています。

一般的には、より少ない引数で関数をエクスポートします。これは実際には関数のラッパーであり、より多くの引数(アキュムレータなど)を使用します。例えば

sum(N) -> sum(N, 0). 
sum(0, Acc) -> Acc; 
sum(N, Acc) -> sum(N - 1, Acc + N). 

そして、あなたが唯一のsum/1をエクスポートする場合、それは完全に罰金です。あなたはsum/2であなたのエンドユーザを悩ませたくありません。

+0

しかし、輸出でない場合、どのようにsum/2を定義しますか? –

+1

私はそれをエクスポートしませんが、ファイルに定義されています。 'sum/1'はファイルレベルで' sum/2'を内部的に使うことができます。定義は輸出とは異なるものです。 – PatNowak

関連する問題