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

时间:2018-01-02 23:30:36

标签: 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;  

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

1 个答案:

答案 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语言的?或者你认为它是副作用表达式的中缀排序操作?

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