Ошибка в коде это выражение имеет тип список, но ожидалось выражение типа a переменная типа a встречается в списке

#ocaml

#ocaml

Вопрос:

Эта ошибка возникает в двух моих задачах, и я не знаю, как ее решить, пожалуйста, помогите

 let rec ins (l1, l2) i = match l1 with
| [] -> []
| _  when i>List.length(l1) ->[] 
| _  when i=0 -> l2@l1
| _  when i<=List.length l1 amp;amp; i>0 -> [List.hd l1] @ [ins((List.tl l1), l2) (i-1)];;

ins ([1;2;3;4;5] , [6;7;8;9;10]) 3;;
 

предполагается, что этот код вставляет 2-й список в 1-й на n-м элементе

Сообщение об ошибке выделяет этот фрагмент кода

 [ins((List.tl l1), l2) (i-1)];;
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

и говоря

 Error: This expression has type 'a list
       but an expression was expected of type 'a
       The type variable 'a occurs inside 'a list
 

Ответ №1:

Эти ошибки «возникают» очень часто, но все же они довольно запутанны. На высоком уровне это означает, что вы используете элемент списка и список в одном и том же контексте. Т.е. система типов сделала вывод, что ваш список состоит из самого себя, своего рода парадокс Рассела.

На практическом уровне это означает, что где-то вы использовали выражение, обозначающее список, в том месте, где вы должны использовать выражение, обозначающее элемент списка (или наоборот).

В вашем случае ins((List.tl l1), l2) (i-1) выражение уже имеет тип 'a list , и вы помещаете его в дополнительный список [ins((List.tl l1), l2) (i-1)] , создавая его 'a = 'a list , что вызывает ошибку возникновения.

Надеюсь, этого будет достаточно, чтобы вы исправили свой код. Удачи! 🙂

Комментарии:

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

2. подсказка: просто снимите скобки [ ] вокруг выделенного выражения