使用OCaml输出简单乘法表

使用OCaml输出简单乘法表,ocaml,Ocaml,我正在尝试创建一个简单的函数,可以将输出写入文件,比如file.txt。输出是一个乘法表(如下所示) 函数参数为5时的乘法表示例: 问题是当我运行代码时OCaml只是挂起(可能是因为无限递归?)。我一直在看逻辑,似乎没问题 (*n is the row counter and n2 is the column counter*) let rec row ch x n = let rec column ch x n n2 = (*If column counter rea

我正在尝试创建一个简单的函数,可以将输出写入文件,比如file.txt。输出是一个乘法表(如下所示)

函数参数为5时的乘法表示例:

问题是当我运行代码时OCaml只是挂起(可能是因为无限递归?)。我一直在看逻辑,似乎没问题

(*n is the row counter and n2 is the column counter*)
let rec row ch x n =
    let rec column ch x n n2 =
        (*If column counter reaches limit then stop here*)
        if (n2 = x+1)
        then ()
        else
            output_string ch (string_of_int (n2*n));
            output_char ch '\t';
            column ch x n (n2+1)
    in
        column ch x n 1;

        (*If row counter reaches limit then stop here*)
        if n = x+1
        then ()
        else
            output_char ch '\n';
            row ch x (n+1);;
稍后我调用表中的行函数,如下所示:

let rec table file x =
    let ch = open_out file in
        row ch x 1;
        close_out ch;;

当我运行表“foo”5时,它只是挂起。另外,在将来,我如何更好地处理这样的错误?OCaml是否有任何推荐的调试选项?

您有两种相同问题的情况:
if/then/else
部分只控制一个表达式,但您希望它控制多个表达式

在第一种情况下,
else
只是控制
输出字符串
。这意味着
函数的其余部分将在所有情况下执行。事实上,这是一个无限递归

在第二种情况下,
else
仅控制
输出字符。同样,这会给你一个无限递归

您可以通过在此处添加
begin/end
来解决此问题:

begin
output_string ch (string_of_int (n2*n));
output_char ch '\t';
column ch x n (n2+1)
end
在这里:

begin
output_char ch '\n'; row ch x (n+1)
end

在我做了这些更改后,代码对我有效。

谢谢您的回复!也为我工作。else是否因为分号运算符而仅控制紧跟在其后的打印表达式?(如果我没记错的话,操作符会扔掉左边的表达式)是的,另一种看待它的方式是
然后
其他
的优先级高于
。您可以通过其他方式组合多个表达式,而不需要使用
开始/结束