您正在使用;;
太多。与流行的观点相反,;;
不是普通OCaml语法的一部分(无论如何,我认为)。这只是一种告诉顶层(REPL)的特殊方法,您希望它能评估您迄今输入的内容。
在open Array
之后留下;;
。但是,除了最后的;;
改为;
以外。
(因为你的名字在你的代码,这恕我直言是好作风引用Array
模块,您也可以直接离开了open Array;;
干脆。)
你想最后;;
因为你想要的顶层到评估你到目前为止输入的内容。
你的语法错误是由事实,你的整个代码是这样
let ... in
let ... in
while ... do
...
done
m
的while
造成一个表达式(OCaml中一切都是表达式)和m
是另一种表达。如果你想连续使用两个表达式,你需要在它们之间使用;
。所以你需要;
后done
。
您也有类型错误。当您创建m
时,您将创建一个int数组(您的初始值为0)。所以你不能在代码中将它变成一个矩阵(一个数组数组)。另外(不要试图用批评来重载你:-)这段代码看起来像命令式的代码。这不是特别习惯的OCaml代码。在大多数人的代码中,使用ref
是非常罕见的。我看到的一个直接改进就是说let n = 5
。你看不到任何地方的n
的值(尽管也许这是更大块代码的一部分)。另一个改进是使用for
而不是while
。
最后,你可以在一个函数调用做整个操作:
let n = 5 in
let m = Array.init n (fun i -> Array.make n 0) in
m
使用显式循环实际上也OCaml中相当罕见(至少在我的代码)。
或者你可以试试这个:
let n = 5 in
let m = Array.make_matrix n n 0 in
m
HI @power_output,因此不代码工厂......你要问一个具体问题。 –
我在Java和C中学到了很多东西,只是通过搜索Google多次导致SO,但现在我遇到了这种语言的问题。我用例子学得最好,但是我没有看到这种语言。我一直在看这段代码改变了很长一段时间,但我似乎无法弄清楚什么是错的,这就是为什么我来这里希望有人能伸出援助之手。 –
你有什么错误? –