要素 x なしで指定されたリストを含む新しいリストを生成する関数を作成しようとしています。
モスクワ ML は、この試合で一部のケースが未使用であると述べています。
fun delete (x,list) = delete(x,[])
|delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest)
Standard ML で行う方法は次のとおりです::
fun delete (item, list) =
case list of
[]=>[]
| xs::ys => if item = xs then delete(item,ys)
else xs::delete(item,ys)
ケースを使用しない場合:
fun delete (item, list) = List.filter(fn x => x <> item) list
多等号を気にしないでください。
これは、最初のケースがどのリストにも一致するため、2 番目のケースは使用されないためです。
ケースは記述された順序で試行され、どちらが「最適」な一致であるかに基づいて選択されるわけではないことに注意してください。
また、無限再帰のわずかな問題もあります
delete (x,list) = delete(x,[])
list
が一致するため[]
、永遠に再帰します。
空のリストから何かを削除すると、結果は空のリストになるはずです。
できることは 2 つのうちの 1 つです。
空でないケースを最初に移動します。
fun delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
| delete (x, list) = []
または、より一般的には、最初のケースを空のリストのみに一致させます。
fun delete (x, []) = []
| delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)