2016-02-19 71 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」相對應。 –