2016-02-19 90 views
0

我正在学习OCaml,目前我正试图探讨OCaml中的迭代如何工作以及如何创建矩阵。我想要一个数组5 x 5填充0.我知道有共享引用的问题,所以我在每次迭代创建一个新的数组,但iam在其他地方,特别是在第6行有问题。让我知道其他问题,如缩进实践。如何在OCaml中创建矩阵?

open Array;; 

let n = ref 5 and i = ref 0 in 
let m = Array.make !n 0 in 
while !i < !n do 
    m.(!i) <- Array.make !n 0;; 
    i := !i + 1;; 
done 

m;; 
+0

HI @power_output,因此不代码工厂......你要问一个具体问题。 –

+1

我在Java和C中学到了很多东西,只是通过搜索Google多次导致SO,但现在我遇到了这种语言的问题。我用例子学得最好,但是我没有看到这种语言。我一直在看这段代码改变了很长一段时间,但我似乎无法弄清楚什么是错的,这就是为什么我来这里希望有人能伸出援助之手。 –

+0

你有什么错误? –

回答

5

您正在使用;;太多。与流行的观点相反,;;不是普通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 
+0

为什么你使用匿名函数作为参数,如果我不使用? –

+0

向您展示它在代码中与“i”相对应。 –