为什么我的while循环不会以这种函数式语言终止?

old*_*959 -1 arrays algorithm functional-programming sml smlnj

我正在尝试使用命令式和功能性概念构建标准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;  
Run Code Online (Sandbox Code Playgroud)

如果我在while循环之后删除第一行,则循环终止.但如果我包括TextIO.output(ap,"A");,它就没有.为什么会这样?

Eri*_*ert 5

让我们用正确的缩进编写你的程序,然后变得清楚错误在哪里:

...
while !row < h do
    TextIO.output(ap,"A");
row := !row + 1;
TextIO.closeOut ap
...
Run Code Online (Sandbox Code Playgroud)

你永远循环,因为增量在循环体外.

你打算写这个:

...
while !row < h do (
   TextIO.output(ap,"A");
   row := !row + 1
);
TextIO.closeOut ap
...
Run Code Online (Sandbox Code Playgroud)

对?

我一直在研究人们在编程时如何犯错误.我很想知道你是怎么来犯这个错误的.如果你认为那种;结合力强于while那么你为什么认为它TextIO.closeOut ap循环之后呢?当然,如果你的信念是;将增量绑定到循环,那么;它也应该将它绑定到循环.您是否认为ML是一种像Python这样的语言,其中循环结构使用空格作为身体范围的指南?

你对;ML的一般信念是什么?你认为;它是一个语句终止符,因为它是用C语言编写的吗?或者你认为它是副作用表达式的中缀排序操作?

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