#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. подсказка: просто снимите скобки
[
]
вокруг выделенного выражения