SML:尾部递归局部辅助函数

SML:尾部递归局部辅助函数,sml,tail-recursion,Sml,Tail Recursion,我正在尝试使用尾部递归局部帮助函数作为赋值的一部分重新编写代码 除_选项外的所有_都是返回类型为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_exce

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

除_选项外的所有_都是返回类型为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);
这个函数使用尾部递归,但是我在递归调用helper函数时出错。错误是: 错误:非构造函数应用于模式中的参数:除\u选项外的所有\u

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;

在这两种情况下,您调用
除_之外的所有_选项
,并将
x
(a
string
)作为第一个参数,而它需要
字符串列表
作为第一个参数

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

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

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

您会得到什么错误?你能发布一个显示所有函数的完整代码吗?另外,乍一看,
xs::acc
将失败,因为
xs
似乎是一个列表。添加了函数和错误coursera课程有一个专门讨论课程作业的讨论论坛。那是讨论家庭作业的好地方