2012-06-02 17 views

回答

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)被处理而不是作为一个正常表达,而且作为保护的表达,这可能具有非确定性的结果(二郎允许在保护表达式仅使用确定性的表达式),所以二郎拒绝在“if”表达式中使用它。

要解决此问题,我建议您改用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.