我尝试使用命令式和功能性概念构建标准ML 程序,并将内容写入文件。但我的while循环似乎没有终止,而是连续打印相同的值。
fun writeImage image filename =
let val ap = TextIO.openOut filename
val (w,h) = size image
val row = ref 0
val stringToWrite = "";
in
while !row < h do
TextIO.output(ap,"A");
row := !row + 1;
TextIO.closeOut ap
end;
如果我在while循环后删除第一行,则循环终止。但如果我加入TextIO.output(ap,"A");
,它就不会。为什么会这样?
答案 0 :(得分:5)
让我们用正确的缩进编写你的程序,然后就会明白错误在哪里:
...
while !row < h do
TextIO.output(ap,"A");
row := !row + 1;
TextIO.closeOut ap
...
你永远循环,因为增量超出了循环体。
你打算写这个:
...
while !row < h do (
TextIO.output(ap,"A");
row := !row + 1
);
TextIO.closeOut ap
...
正确?
我一直在研究人们在编程时如何犯错误。我很想知道你是怎么来犯这个错误的。如果您认为;
比while
更强大,那么为什么您认为{/ 1}}在循环后是?当然,如果你的信念是TextIO.closeOut ap
将增量绑定到循环,那么;
也应该将它绑定到循环。您是否认为ML是一种像Python这样的语言,其中循环结构使用空格作为指向身体范围的指南?
您对ML中;
的一般信息是什么?您是否认为;
是语句终止符,因为它是C语言的?或者你认为它是副作用表达式的中缀排序操作?
您的思考过程是什么,工具如何让您更轻松地解决问题而无需寻求帮助?