9

为什么是非法的?

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

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

4

1 回答 1

16

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.
于 2012-06-02T10:46:21.360 回答