Вопрос по – Почему сравнение результатов функции является недопустимым исключением в Erlang?

9

Почему это незаконно?

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

Я имею в виду, если я определяю обе части выражения по отдельности, это прекрасно работает. Но сравнение возвращаемых функций должно быть тривиальным, не так ли? Думаю, я упускаю что-то еще под этим.

Ваш Ответ

1   ответ
15

If Выражение не работает в Erlang так же, как в других языках программирования.

В соответствии сhttp://www.erlang.org/doc/reference_manual/expressions.html (пункт 7.7 Если):

The branches of an if-expression are scanned sequentially until a guard sequence GuardSeq which evaluates to true is found.

В вашем примере выражениеF( X + 2*E ) < F( X + E ) трактуется не как нормальное выражение, а как защитное выражение, которое может иметь недетерминированные результаты (Erlang позволяет использовать только детерминированные выражения в защитных выражениях), поэтому Erlang отказывается использовать его в & quot; if & quot; выражение.

Чтобы решить эту проблему, я бы рекомендовал использовать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.

Похожие вопросы