0

我正在尝试使用尾递归本地辅助函数作为分配的一部分重新编写代码。

all_except_option 是一个返回类型为 fn 的函数:string * string list -> string list option

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

在这两种情况下,您都all_except_option使用x(a string) 作为第一个参数调用,而它期望 astring list作为第一个参数。

此外,case 的 case 不能是对函数的调用,而是对某个类型的构造函数的调用。例如,仔细查看您的代码:

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

请注意您如何使用函数调用而不是all_except_option返回的类型构造,并且您正在使用xs::acc在这种情况下无效的构造,如xs列表。最后,x是列表的头部,所以它不能是[]。我仍然不清楚该aux功能想要实现什么,但这些错误是可疑的。

于 2013-01-28T20:59:27.197 回答