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
中正确和错误回答的问题,然后计算统计数据。很抱歉,这是一个错误