Это ошибка типа, а не синтаксическая ошибка.
Функция OCaml всегда должна возвращать результат того же типа. Прямо сейчас, когда элемент находится в списке, ваша функция пытается вернуть другой тип, чем если элемент отсутствует в списке.
В частности, если элемент уже есть, функция вызывает print_string
, который возвращает ()
. Это называется unit
и является заполнителем, не представляющим интересного значения. Когда элемент еще не существует, ваша функция возвращает значение типа 'a list
. Почти наверняка, что вам нужно сделать, это вернуть список во всех случаях.
Трудно сказать больше, не видя больше вашего кода, но самый обычный способ справиться с этой ситуацией - вернуть старый список, когда элемент уже существует, и новый, более длинный список, когда элемент еще не установлен там.
Update
Есть много вещей, чтобы исправить в этом коде, но в этом суть упражнения я полагаю.
Ваша следующая проблема заключается в том, что List.iter
является императивной функцией, то есть хочет, чтобы сделал чем-то, а не дал результат. Следовательно, функция, которая выполняет итерацию по списку, должна возвращать единицу (описанную выше). Вместо этого вы используете функцию uniq
, которая возвращает список.
Если вы хотите использовать функцию высшего порядка, как List.iter
, который является отличным стилем OCaml, вам нужно будет использовать складку (List.fold_left
или List.fold_right
), целью которого является накопление результата.
Какой тип это должно быть?Когда я меняю оператор печати на '[1; 2; 3]', он дает мне ошибку: это выражение имеет тип int list -> int list , но ожидалось выражение для типа int list -> unit Тип int list не совместим с блоком типа ' –
Если вы хотите, чтобы ваша функция была полиморфной, вам нужно вернуть что-то того же типа, что и список ввода. Фактически, вы должны почти наверняка просто вернуть список входных данных для этого случая. Трудно быть уверенным, не видя всего вашего кода. –