我正在尝试使用尾递归本地帮助函数重新编写代码作为赋值的一部分。
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;
答案 0 :(得分:2)
在这两种情况下,您都会使用all_except_option
(x
)作为第一个参数调用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
函数想要实现什么,但这些错误是可疑的。