SML:尾递归本地帮助函数

时间:2013-01-28 19:46:33

标签: sml tail-recursion

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

all_except_option是一个函数,其返回类型为fn:string * 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;

1 个答案:

答案 0 :(得分:2)

在这两种情况下,您都会使用all_except_optionx)作为第一个参数调用string,而期望string list作为第一个参数。

此外,案例的情况不能是对函数的调用,而是类型的构造函数。例如,密切关注您的代码:

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

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