当前位置: 首页 > 知识库问答 >
问题:

SML:尾递归本地辅助函数

胡景焕
2023-03-14

我试图使用尾部递归局部辅助函数作为赋值的一部分来重新编写代码。

all_except_选项是一个返回类型为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\u except\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;

共有1个答案

许彦
2023-03-14

在这两种情况下,您都使用x(一个字符串)作为第一个参数调用所有除_选项,而它期望字符串列表作为第一个参数。

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

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

请注意,您使用的是函数调用,而不是除_选项之外的所有_将返回的类型构造,并且您使用的构造在这种情况下无效,因为xs是一个列表。最后,x是列表的头,因此它不能是<[]。我仍然不清楚aux函数想要实现什么,但这些错误是可疑的。

 类似资料:
  • 我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的

  • 我有一个家庭作业问题,它给出了一个递归函数,我必须使用尾部递归来实现它。函数为f(0)=1 f(n)=1 2*f(n-1) 我并不擅长尾部递归,我试着查找示例,但我发现的都是没有斐波那契序列的示例,这没有多大帮助。 我真正拥有的是 我知道尾递归基本上每次调用都计算函数,我只是不知道如何实现它。 编辑:我打了一个错字f(n)应该是1 2*f(n-1)

  • 文本辅助函数所包含的函数只能对文本进行处理。 装载文本辅助函数 采用如下方式装载该辅助函数:$this->load->helper('text'); 可用函数如下: word_limiter() 根据指定的词语(由于是英语,对中文应该是以空格为判断标准,译者注)数目对一段字符串进行截取。范例:$string = "Here is a nice text string consisting of e

  • 文本辅助函数文件包含了一些帮助你处理文本的函数。 加载辅助函数 可用函数 加载辅助函数 该辅助函数通过下面的代码加载: $this->load->helper('text'); 可用函数 该辅助函数有下列可用函数: word_limiter($str[, $limit = 100[, $end_char = '…']]) 参数: $str (string) -- Input string $li

  • 我一直在努力学习SML NJ(standard ML New Jersey),我遇到了一个我理解为递归的函数,但我不太明白为什么这个函数会返回它的值。 功能: 我知道如果sum的值为0,那么将返回0。然而,我不明白第二部分是如何工作的。 测试函数: 我相信它应该计算如:sum n=(n(sum(n-1))),所以给定n=2,(2(sum(2-1))= 但是,给定n=4,(4(和(4-1))= 如果

  • 假设我编写这样的代码: 我如何让Kotlin优化这些相互递归的函数,以便在不抛出StackOverflower错误的情况下运行main?tailrec关键字适用于单函数递归,但没有更复杂的功能。我还看到一个警告,在使用关键字tailrec的地方没有找到尾部调用。也许这对编译器来说太难了?