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

aka*_*nuk 9 erlang guard

为什么这是非法的?

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

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

Ale*_*lev 15

If 表达式在Erlang中的工作方式与其他编程语言中的方式不同.

根据http://www.erlang.org/doc/reference_manual/expressions.html(第7.7段如果):

依次扫描if表达式的分支,直到找到评估为真的保护序列 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.
Run Code Online (Sandbox Code Playgroud)