为什么比较函数结果是Erlang中的非法保护异常?

时间:2012-06-02 09:52:11

标签: erlang guard

为什么这是非法的?

min1_e_( F, X, E) ->
    if 
        F( X + 2*E ) < F( X + E ) ->   % ?
            min1_e_( F, X, E*2 );
        true ->
            E
    end.

我的意思是,如果我分别定义表达式的两个部分,它就可以正常工作。但是比较函数返回应该是微不足道的,不应该吗?以为我错过了更多的东西。

1 个答案:

答案 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.