割り当ての一部として末尾再帰ローカル ヘルパー関数を使用してコードを書き直そうとしています。
all_except_option は、戻り型 fn を持つ関数です: string * string list -> string list オプション
fun all_except_option ([], _ ) = NONE
| all_except_option (_, "") = NONE
| all_except_option (str_list, str) =
let
fun all_except_option' [] = []
| all_except_option' (x::str_list) =
if x = str then
all_except_option' str_list
else
x :: all_except_option' str_list
in
SOME (all_except_option' str_list)
end;
以下の関数は、末尾再帰ローカル ヘルパー関数を使用しない関数です。
fun sub1 ([], s) = []
| sub1 (x :: xs, s) =
case all_except_option(x, s) of NONE => sub1(xs, s) //
| SOME y => y @ get_substitutions1(xs, s);
この関数は末尾再帰を使用しますが、ヘルパー関数を再帰的に呼び出すとエラーが発生します。エラーは次のとおりです: エラー: 非コンストラクターがパターンの引数に適用されました: all_except_option
fun get_substitutions2 (s,str) =
let fun aux(s,x::xs,acc) =
case x of [] => acc
| all_except_option(x, s) => aux(s,xs,xs::acc)
in
aux(s,str,[])
end;