Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何在SML中摆脱这个无限循环_Loops_Infinite Loop_Sml_Smlnj - Fatal编程技术网

Loops 如何在SML中摆脱这个无限循环

Loops 如何在SML中摆脱这个无限循环,loops,infinite-loop,sml,smlnj,Loops,Infinite Loop,Sml,Smlnj,下面是我的代码现在的样子。 我想做一个多选题程序 这是一种非常初级的处理方式,但我发现很难用更“专业”的方式来构造代码 我从我的问题文件中添加了一个捕获。 所有问题都遵循此格式 我的代码按我希望的方式工作,但循环的最后一圈是无止境的。控制台为我提供了三个问题,我会回答,如果我没有找到答案,我会得到正确的答案,但是第三个问题会被一次又一次地问到,没有结束 我已经到处找了,我不知道我的错误在哪里。我需要帮助才能摆脱这个循环。我更改了我的ask函数,使用要问的问题数量,而不是要显示的问题块列表 fu

下面是我的代码现在的样子。

我想做一个多选题程序

这是一种非常初级的处理方式,但我发现很难用更“专业”的方式来构造代码

我从我的问题文件中添加了一个捕获。

所有问题都遵循此格式

我的代码按我希望的方式工作,但循环的最后一圈是无止境的。控制台为我提供了三个问题,我会回答,如果我没有找到答案,我会得到正确的答案,但是第三个问题会被一次又一次地问到,没有结束


我已经到处找了,我不知道我的错误在哪里。我需要帮助才能摆脱这个循环。

我更改了我的
ask
函数,使用要问的问题数量,而不是要显示的问题块列表

fun ask(n) =
    let
      fun loop (n) =
          let
              val newQues = randList(1)
              val question = print(
                  "\n"^
                  List.nth(readlist("questionBank.txt"), hd newQues)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+1)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+2)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+3)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+4)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+5)^"\n"
              )
              val userAns = getAnswer()
          in
              if userAns = List.nth(readlist("questionBank.txt"), (hd newQues)+6)^"\n" then
                (
                  print("Your answer is CORRECT.\n");
                  if n > 1 then loop (n-1) else ()
                )
              else (
                  print(
                      "Your answer is INCORRECT.\nThe correct answer is: "^
                      List.nth(readlist("questionBank.txt"), (hd newQues)+6)
                      ^"\n\n"
                  );
                  if n > 1 then loop (n-1) else ()
                )
          end
    in
        loop (n)
    end;

ask(5);
所以它现在正按我所希望的那样工作


如果有人有优化想法,我很乐意阅读。

我更改了我的
ask
功能,使用要问的问题数量,而不是要显示的问题块列表

fun ask(n) =
    let
      fun loop (n) =
          let
              val newQues = randList(1)
              val question = print(
                  "\n"^
                  List.nth(readlist("questionBank.txt"), hd newQues)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+1)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+2)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+3)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+4)^"\n\t"^
                  List.nth(readlist("questionBank.txt"), (hd newQues)+5)^"\n"
              )
              val userAns = getAnswer()
          in
              if userAns = List.nth(readlist("questionBank.txt"), (hd newQues)+6)^"\n" then
                (
                  print("Your answer is CORRECT.\n");
                  if n > 1 then loop (n-1) else ()
                )
              else (
                  print(
                      "Your answer is INCORRECT.\nThe correct answer is: "^
                      List.nth(readlist("questionBank.txt"), (hd newQues)+6)
                      ^"\n\n"
                  );
                  if n > 1 then loop (n-1) else ()
                )
          end
    in
        loop (n)
    end;

ask(5);
所以它现在正按我所希望的那样工作


如果有人有优化的想法,我很乐意阅读。没有条件让你脱离
循环
;在两个条件分支中都无条件递归

如果不是因为

List.length(List.take(questionIndexList, List.length(questionIndexList)-1))
总是相同的号码。
(即
List.length(questionIndexList)-1
–如果从列表中获取K个元素,则结果的长度为K。不需要创建列表来确定其长度。)

但我会用不同的方式来组织

每次需要问题时,您都在阅读文件。
最好只读取一次文件,然后将列表传递给其他人

首先,表示问题和答案的类型:

type Options = string * string * string * string;
datatype QA = QA of string * Options * string;
还有两个函数用于从笨拙的字符串列表中收集这些字符串:

fun toQAs [] = []
  | toQAs (q::o1::o2::o3::o4::a::qas) = (QA (q, (o1,o2,o3,o4), a)) :: (toQAs qas);

fun readQuestions file = toQAs (readlist file);
以及用于打印问题的实用程序函数:

fun printQuestion (QA (q, (o1,o2,o3,o4), _)) = print ("\n"^ q^"\n\t"^ o1^"\n\t"^ o2^"\n\t"^ o3^"\n\t"^ o4^"\n");
ask
功能仅获取问题列表并询问所有问题:

fun ask [] = print "No further questions.\n"
  | ask  (q::qs) =
    let val (QA (_, _, answer)) = q
    in
        printQuestion q;
        if getAnswer() = answer^"\n" then
             print "Your answer is CORRECT.\n"
         else
             print ("Your answer is INCORRECT.\nThe correct answer is: "^ answer ^"\n\n");
        ask qs
    end;
最后是一个函数,它根据文件创建一个随机问题列表,并询问他们:

fun go () =
    let
        val QAs = readQuestions "questionBank.txt"
    in
        ask (map (fn i => List.nth(QAs, i)) (randList (length QAs) 3))
    end;

没有条件使您脱离
循环
;在两个条件分支中都无条件递归

如果不是因为

List.length(List.take(questionIndexList, List.length(questionIndexList)-1))
总是相同的号码。
(即
List.length(questionIndexList)-1
–如果从列表中获取K个元素,则结果的长度为K。不需要创建列表来确定其长度。)

但我会用不同的方式来组织

每次需要问题时,您都在阅读文件。
最好只读取一次文件,然后将列表传递给其他人

首先,表示问题和答案的类型:

type Options = string * string * string * string;
datatype QA = QA of string * Options * string;
还有两个函数用于从笨拙的字符串列表中收集这些字符串:

fun toQAs [] = []
  | toQAs (q::o1::o2::o3::o4::a::qas) = (QA (q, (o1,o2,o3,o4), a)) :: (toQAs qas);

fun readQuestions file = toQAs (readlist file);
以及用于打印问题的实用程序函数:

fun printQuestion (QA (q, (o1,o2,o3,o4), _)) = print ("\n"^ q^"\n\t"^ o1^"\n\t"^ o2^"\n\t"^ o3^"\n\t"^ o4^"\n");
ask
功能仅获取问题列表并询问所有问题:

fun ask [] = print "No further questions.\n"
  | ask  (q::qs) =
    let val (QA (_, _, answer)) = q
    in
        printQuestion q;
        if getAnswer() = answer^"\n" then
             print "Your answer is CORRECT.\n"
         else
             print ("Your answer is INCORRECT.\nThe correct answer is: "^ answer ^"\n\n");
        ask qs
    end;
最后是一个函数,它根据文件创建一个随机问题列表,并询问他们:

fun go () =
    let
        val QAs = readQuestions "questionBank.txt"
    in
        ask (map (fn i => List.nth(QAs, i)) (randList (length QAs) 3))
    end;

@PeterSmith为了能够使用您的建议,我更改了代码,但最后出现了以下错误:test1.sml:88.46-88.69错误:运算符不是函数[tycon不匹配]运算符:表达式中的int list:(randList(length QAs)) 3@PeterSmith我还想知道,如果我想根据每个问题属于一个类别的假设,按类别计算正确答案的百分比,我该如何进行?我以前是用一种方法来做的,但是对于数据类型,我想它会有点难以实现handle@IndifineGenome谁是“彼得·史密斯”?首先,你犯了一个括号错误。使用复制和粘贴(这是从测试代码复制和粘贴的)。其次,在问题类型中添加“类别”非常容易。例如,您可以返回
ask
中回答正确和错误的问题,然后计算统计数据。很抱歉,这是一个错误@PeterSmith我更改了代码以使用您的建议,但最后出现了以下错误:test1.sml:88.46-88.69错误:运算符不是函数[tycon失配]运算符:表达式中的int list:(randList(长度QAs))3@PeterSmith我还想知道,如果我想根据每个问题属于一个类别的假设,按类别计算正确答案的百分比,我该如何进行?我以前是用一种方法来做的,但是对于数据类型,我想它会有点难以实现handle@IndifineGenome谁是“彼得·史密斯”?首先,你犯了一个括号错误。使用复制和粘贴(这是从测试代码复制和粘贴的)。其次,在问题类型中添加“类别”非常容易。然后,您可以返回
ask
中正确和错误回答的问题,然后计算统计数据。很抱歉,这是一个错误