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