【问题标题】:Why comparing function results is an illegal guard exception in Erlang?为什么比较函数结果是 Erlang 中的非法守卫异常?
【发布时间】:2012-06-07 08:21:18
【问题描述】:

为什么是非法的?

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

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

【问题讨论】:

    标签: erlang guard


    【解决方案1】:

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

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

    依次扫描 if 表达式的分支,直到找到评估为 true 的 保护序列 GuardSeq。

    在您的示例中,表达式F( X + 2*E ) &lt; F( X + E ) 不被视为普通表达式,而是被视为保护表达式,它可能具有不确定的结果(Erlang 允许在保护表达式中仅使用确定性表达式),因此 Erlang 拒绝在“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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2016-04-26
      • 2019-11-25
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多