我有一个模块可以进行一些非约束最小化。我想让它的界面尽可能简单,所以最好的选择是将其简化为单个函数,例如:min_of( F)。
但是一旦它是残酷的计算,我将不得不处理至少两个常数:最小化算法的精度和最大迭代次数,因此如果目标函数根本没有局部最小值,它就不会挂起。
无论如何,下一个最佳选择是:min_of(F,迭代,EPS)。没关系,但我不喜欢它。我还想再定义一个min_of(F)如下:
min_of( F ) ->
min_of( F, 10000, 0.0001).
但没有神奇的数字。
我是 Erlang 的新手,所以我不知道如何正确处理这个问题。我应该定义宏、变量还是返回常量的函数?甚至别的什么?我发现 Erlang 很有表现力,所以这个问题似乎更像是一种好的做法,而不是技术问题。
您可以像这样定义宏
-define(ITERATIONS, 10000).
-define(EPS, 0.0001).
然后将它们用作
min_of(F, ?ITERATIONS, ?EPS).
您可以使用宏,但也可以使用内联函数。
-compile({inline, [iterations/0, eps/0]}).
iterations() -> 10000.
eps() -> 0.0001.
然后以方式使用它
min_of(F) ->
min_of(F, iterations(), eps()).
好处是您可以使用所有语法工具而无需epp
。在这种情况下,函数调用也不是性能关键,因此您甚至可以不使用inline
指令。