如何在Erlang中定义类似常量的东西

11

我有一个模块,用于进行一些非约束最小化。 我想尽可能简化其接口,因此最好的选择是将其缩减为类似于 min_of( F ) 的单个函数。

但由于这是一种粗暴的计算方法,因此我必须处理至少两个常量:最小化算法的精度和最大迭代次数,以便在目标函数根本没有局部最小值时不会让程序挂起。

无论如何,下一个最佳选择是:min_of( F, Iterations, Eps )。这还不错,但我不喜欢它。我仍然希望有另一个类似于 min_of( F ) 的定义,就像这样:

min_of( F ) ->
    min_of( F, 10000, 0.0001).

但不要使用魔法数值。

我对Erlang很陌生,所以不知道如何正确处理这个问题。我应该定义一个宏、变量或者一个返回常量的函数吗?还是其他什么方法?我发现Erlang相当表达性强,所以这个问题似乎更多地涉及良好的编程实践,而不是技术问题。

2个回答

22
你可以像这样定义宏
-define(ITERATIONS, 10000).
-define(EPS, 0.0001).

然后将它们用作

min_of(F, ?ITERATIONS, ?EPS).

6

你可以使用宏,但也可以使用内联函数。

-compile({inline, [iterations/0, eps/0]}).

iterations() -> 10000.
eps() -> 0.0001.

然后按照要求使用它

min_of(F) ->
  min_of(F, iterations(), eps()).

好处是您可以使用所有语法工具,而无需使用epp。在这种情况下,调用函数也不是性能关键,因此甚至可以不使用inline指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接