为什么是非法的?
min1_e_( F, X, E) ->
if
F( X + 2*E ) < F( X + E ) -> % ?
min1_e_( F, X, E*2 );
true ->
E
end.
我的意思是,如果我分别定义表达式的两个部分,它就可以正常工作。但是比较函数返回应该是微不足道的,不是吗?认为我错过了更多的东西。
If
表达式在 Erlang 中的工作方式与其他编程语言不同。
根据http://www.erlang.org/doc/reference_manual/expressions.html(第 7.7 段如果):
依次扫描 if 表达式的分支,直到找到评估为 true 的保护序列GuardSeq。
在您的示例中,表达式F( X + 2*E ) < F( X + E )
不被视为普通表达式,而是被视为保护表达式,它可能具有非确定性结果(Erlang 允许在保护表达式中仅使用确定性表达式),因此 Erlang 拒绝在 "如果”表达式。
要解决此问题,我建议改用case
表达式。像这样的东西:
min1_e_( F, X, E) ->
case F(X + 2*E) < F(X + E) of
true -> min1_e_( F, X, E*2 );
false -> E
end.