2017-04-13 4 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);; 

他のマトリックスのサブマトリックスであるかどうかを確認しようとしています。しかし、私はタイプリストのリストを使用する必要があります。そして、私は定義されたList関数のどれも使うことができません。 Obviosly私はList hd、tlを使用していますが、私はそれを置き換えます。サブマトリックス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

"しかしリストリストを使用する必要があります: 学習以外の目的でこれを行う場合、リストを使用して行列を表すべきではありません。非常に非効率的です。 – 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.h1とglavaの代わりにList.hdの代替です。

0

does_it_containとdoes_itの署名がively respectnotされています。それらの

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

なし、また、(あなたが期待するよう'a list'a list list listが行列していない)の引数としてあなたを

を2行列を取ることができませんあなたの関数のコードをCかjavaのように書く:引数はOcamlのかっこを通らない。タプルにはカッコが使用されますが、この場合は役に立ちません。

+0

だから、それは役に立たない、または? 申し訳ありませんが、私はOcamlの初心者です。私はDelphi、Java、Cを書いたが、Ocamlはただのものだった。私はそれの周りに私の頭を包むように見えることはできません。 このコードを改善する方法についての提案があれば、それは可能でしょうか? ありがとう I – Broda

+0

最初は無駄です。しかし、それぞれの要素を処理するために別のデータ構造(タプル)を作成するので、コードにペナルティを追加しています。より大きいコードでは、時間の複雑さが増します - 大きな行列のコードでもそうです。 –