我正在通过了解你一些Erlang ,在关于尾递归的讨论中,作者定义了两个函数:tail_fac/1
和tail_fac/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).
我的linter说tail_fac/2
未定义,即使我尝试在导出中定义它。
答案 0 :(得分:3)
在Erlang中,您实际上可以使用-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
来打扰最终用户。