为什么比较函数的结果是在二郎山非法后卫例外?(Why comparing function resu

2019-06-25 02:32发布

为什么是非法的?

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

我的意思是,如果我分别定义表达式的两个部分,它工作正常。 但对比函数返回的应该是微不足道的,不应该吗? 我想我想的东西更多的下面。

Answer 1:

If表达不二郎以同样的方式在其他编程语言。

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

如果一个表达式的分支被依次扫描,直到其计算结果为真保护序列 GuardSeq被发现。

在实施例中,表达F( X + 2*E ) < F( X + E )进行处理而不是作为一个正常表达,而且作为保护的表达,这可能具有非确定性的结果(二郎允许仅使用确定性的表达式在保护表达式),所以二郎拒绝在“如果”表达式中使用它。

要解决这个问题,我会建议使用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.


文章来源: Why comparing function results is an illegal guard exception in Erlang?
标签: erlang guard