为什么我的 while 循环不会以这种函数式语言终止?
Why does my while loop not terminate in this functional language?
我正在尝试使用命令式和函数式概念构建标准 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");
,它就不会。为什么会这样?
让我们把你的程序写成正确的缩进,然后就清楚错误在哪里了:
...
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
结合更强,那么您为什么认为 TextIO.closeOut ap
在 循环之后是 ?当然,如果您认为 ;
将增量绑定到循环,那么 ;
也应该将其绑定到循环。您是否认为 ML 是一种类似于 Python 的语言,其中循环结构使用空格作为主体范围的指南?
您对 ;
在 ML 中更普遍的看法是什么?您是否认为 ;
是语句终止符,就像在类 C 语言中一样?或者你认为它是对副作用表达式的中缀排序操作?
您在这里的思考过程是什么?工具如何让您更轻松地解决问题而无需寻求帮助?
我正在尝试使用命令式和函数式概念构建标准 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");
,它就不会。为什么会这样?
让我们把你的程序写成正确的缩进,然后就清楚错误在哪里了:
...
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
结合更强,那么您为什么认为 TextIO.closeOut ap
在 循环之后是 ?当然,如果您认为 ;
将增量绑定到循环,那么 ;
也应该将其绑定到循环。您是否认为 ML 是一种类似于 Python 的语言,其中循环结构使用空格作为主体范围的指南?
您对 ;
在 ML 中更普遍的看法是什么?您是否认为 ;
是语句终止符,就像在类 C 语言中一样?或者你认为它是对副作用表达式的中缀排序操作?
您在这里的思考过程是什么?工具如何让您更轻松地解决问题而无需寻求帮助?