为什么我的 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 语言中一样?或者你认为它是对副作用表达式的中缀排序操作?

您在这里的思考过程是什么?工具如何让您更轻松地解决问题而无需寻求帮助?