(* 該当のデータがなかったときに起こす例外 *) exception CannotHappen (* lst の j 番目の要素を取り除いたリストを返す *) (* remove : 'a list -> int -> 'a list *) let rec remove lst j = match lst with (* lst でパターンマッチをする *) [] -> (* lst が空リストの場合 *) raise CannotHappen (* 例外を起こして終了する *) | first :: rest -> (* lst の 頭要素が first、残りが rest の場合 *) if j = 0 then rest (* 該当要素なら rest を返す *) else first :: remove rest (j - 1) (* first は残し、再帰する *) (* test *) let () = assert (remove ["X"; "Y"; "Z"] 0 = [ "Y"; "Z"]) (* assert (<テストするプログラム> = <期待される答え>) *) let () = assert (remove ["X"; "Y"; "Z"] 1 = ["X"; "Z"]) let () = assert (remove ["X"; "Y"; "Z"] 2 = ["X"; "Y" ]) (* lst の i 番目のリストの j 番目の要素を取り除いたリストを返す *) (* remove_lst : 'a list list -> int -> int -> 'a list list *) let rec remove_lst lst i j = match lst with (* lst でパターンマッチをする *) [] -> (* lst が空リストの場合 *) raise CannotHappen (* 例外を起こして終了する *) | first :: rest -> (* lst の 頭要素が first、残りが rest の場合 *) if i = 0 then remove first j :: rest (* 該当リストなら j 番目を削除 *) else first :: remove_lst rest (i - 1) j (* first 不変で、再帰する *) (* test *) let () = assert (remove_lst [["X";"Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]] 0 0 = [[ "Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]]) let () = assert (remove_lst [["X";"Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]] 0 1 = [["X"; "Z"]; ["U";"V"]; ["A";"B";"C";"D"]]) let () = assert (remove_lst [["X";"Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]] 0 2 = [["X";"Y" ]; ["U";"V"]; ["A";"B";"C";"D"]]) let () = assert (remove_lst [["X";"Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]] 1 0 = [["X";"Y";"Z"]; [ "V"]; ["A";"B";"C";"D"]]) let () = assert (remove_lst [["X";"Y";"Z"]; ["U";"V"]; ["A";"B";"C";"D"]] 2 1 = [["X";"Y";"Z"]; ["U";"V"]; ["A"; "C";"D"]])