なぜ違法なのですか?
min1_e_( F, X, E) ->
if
F( X + 2*E ) < F( X + E ) -> % ?
min1_e_( F, X, E*2 );
true ->
E
end.
つまり、式の両方の部分を別々に定義すると、うまく機能します。しかし、関数の戻り値を比較するのは些細なことですよね? その下にもっと何かが欠けていると思います。
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.