Подматрица Ocaml

    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, но я заменю его.

Я получаю сообщение об ошибке, когда пытаюсь вызвать функцию, которую я не понимаю.

   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 # 

Пожалуйста помоги!

2 ответа

Решение

Я понял.

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.

Сигнатуры do_it_contain и do_it уважительно не относятся:

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

Ни один из них не способен принять 2 матрицы в качестве аргументов ('a list а также 'a list list list не матрица, как вы ожидаете)

Кроме того, вы пишете код своей функции, как если бы это был C или java: аргумент не должен передаваться через круглые скобки в Ocaml. Круглые скобки используются для кортежей - что в этом случае бесполезно.

Другие вопросы по тегам