Ошибка в коде, это выражение имеет тип списка, но ожидалось выражение типа a, переменная типа a встречается в списке - PullRequest
0 голосов
/ 19 апреля 2019

Эта ошибка возникает в двух моих задачах, и я не знаю, как ее решить. Pls help

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

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

этот код должен вставить второй список в первый по 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 Ответ

1 голос
/ 19 апреля 2019

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

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

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

Надеюсь, этого будет достаточно для исправления вашего кода.Удачи!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...