let rec remove x = function
y :: l when x = y -> l
|y :: l (* x <> y *) -> y :: remove x l
|[] -> []
この本には、この関数には問題があると書かれています。要素が見つからない場合、リスト全体が不必要にコピーされます。したがって、次の改善されたバージョンが提供されます。
exception Unchanged
let rec remove_inner x = function
y :: l when x = y ->
l
|y :: l ->
y :: remove_inner x l
|[] ->
raise Unchanged
let remove x l =
try remove_inner x l with
Unchanged ->
l
ここのポイントがよくわかりません。