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 が見つかるまで、if 式の分岐が順次スキャンされます。

あなたの例では、式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 に答える