2017-04-13 39 views
0
let moja_matrika1 = [[1; 2]; [3; 4]];; 
let moja_matrika2 = [[4; 7; 8]; [3; 2; 1]];; 

let rec does_it_contain (lis1, lis2) = 
if (List.hd lis1 = []) then false 
else if (List.hd lis1 = lis2) then true 
else does_it_contain ((List.tl lis1), lis2);; 

let rec does_it (matrix, lis1) = 
if (matrix = []) then false 
else if does_it_contain (List.hd matrix, List.hd lis1) = true then true 
else does_it (List.tl matrix, lis1);; 

does_it (moja_matrika1, moja_matrika2);; 

我想檢查一個矩陣是否是另一個矩陣的sbumatrix。但我必須使用類型列表。而且我不能使用任何定義的List函數。顯然,我使用List hd,tl,但我會替換它。Submatrix Ocaml

當我嘗試調用至少不理解的函數時出現錯誤。

does_it (moja_matrika1, moja_matrika2);; 
Error: This expression has type int list list 
     but an expression was expected of type 'a list list list 
     Type int is not compatible with type 'a list # 

請幫忙!

+0

「_but我必須使用類型列表list_」: 如果你這樣做的任何事情比學習別人,你不應該用列表來表示矩陣,這是非常低效的。 – ChriS

+0

我知道,這是爲了學校。 – Broda

回答

0

我想通了。

let rec does_it_contain (lis1, lis2) = 
    if rep lis1 = [] then false 
    else if rep lis2 = [] then false 
    else if ( glava lis1 = glava lis2) then true 
else does_it_contain (lis1, rep lis2);; 

let rec does_it (matrica, matrica1) = 
    if rep matrica = [] then false 
    else if rep matrica1 = [] then false 
    else if does_it_contain (glava matrica, glava matrica1) = true then true 
    else does_it (rep matrica, rep matrica1);; 


does_it(moja_matrika1, moja_matrika2);; 

rep是List.tl的替代品,glava是List.hd的替代品。

0

does_it_contain和does_it的簽名是結構延續respectnot:

'a list list * 'a list -> bool 
    'a list list list * 'a list list -> bool 

他們都不是能夠拿2矩陣作爲參數('a list'a list list list像您期望的不是矩陣)

而且,你把你的函數的代碼寫成如C或者java一樣:參數不能通過Ocaml的圓括號傳遞。括號用於元組 - 在這種情況下這沒有用。

+0

那麼,它沒用,或? 我很抱歉,我是Ocaml的初學者。我寫了Delphi,Java,C,但Ocaml只是別的。我似乎無法把頭圍住它。 有關如何改進此代碼的任何建議,使其工作,如果它是可行的? 謝謝 我 – Broda

+0

在第一位,它是無用的。但是它也會給你的代碼增加一些代價,因爲它會創建另一個數據結構(元組),以解構每個元素。在較大的代碼中,它會增加時間複雜度 - 甚至可能會導致您的代碼使用大矩陣。 –