私の先生は最近、"let" と "in" を使用する ML の関数について調べましたが、関数の本体は、それらがどのように連携して結果を生成するのか理解できないため、私には混乱を招きます。この関数は、庭の野菜のリストを取得し、元の野菜を特定の代替品に置き換えます。そのため、元の要素が含まれるすべての場所でリストが代替品を出力します。これが関数です。
fun replaceVegetable(orig, subt, Garden([]) = Garden([])
| replaceVegetable(orig, subt, Garden([first::rest]) =
let val Garden(newRest) =
replaceVegetable(orig, subst, Garden(rest));
in Garden((if first = orig then subst else first)::newRest)
end
| replaceVegetable(orig, subst, x) = x;
最後のパターン「replaceVegetable(orig, subst, x) = x;」については心配していませんが、主に 2 番目のパターンを理解することに関心があります。Garden(newRest) は関数のローカル変数であり、 replaceVegetable(orig, subst, Garden(rest)) が生成するものはすべてそのローカル変数に格納されることを理解していると思います。「in Garden((if first = orig then subst else first)::newRest)」で何が起こるか正確にはわかりません代用品は?もしそうなら、関数全体としてそれがどのように行われているかを正確に理解することはできません。