0

割り当ての一部として末尾再帰ローカル ヘルパー関数を使用してコードを書き直そうとしています。

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;
4

1 に答える 1

2

どちらの場合も、 (a ) を最初の引数として呼び出しますがall_except_optionx最初stringstring listパラメーターとして a が必要です。

また、ケースのケースは、関数の呼び出しではなく、型のコンストラクターにすることはできません。たとえば、コードをよく見ると、次のようになります。

case x of 
[] => acc
| all_except_option(x, s) => aux(s,xs,xs::acc) 

返されるものの型構築の代わりに関数呼び出しを使用していることに注意してください。また、リストのように、この場合は無効なall_except_option構造を使用していることにも注意してください。最後に、はリストの先頭であるため、 になることはできません。その関数が何を達成したいのかはまだはっきりしていませんが、これらのエラーは疑わしいものです。xs::accxsx[]aux

于 2013-01-28T20:59:27.197 に答える