Во-первых, я обычно избегаю таких функций, как List.hd
, так как обработка шаблонов обычно более понятна и менее подвержена ошибкам. В этом случае ваш if
может быть заменен защищенными шаблонами (предложение when
после шаблона). Я думаю, что причиной вашей ошибки является то, что ваш код завершается ошибкой, когда t
равно []
; Защищенные шаблоны помогают избежать этого, делая случаи более явными. Таким образом, вы можете сделать (x::xs)::(y::ys)::t when x = y
как выражение в вашем выражении match
, чтобы проверить, совпадают ли заголовки первых двух элементов списка. В OCaml не редкость иметь несколько последовательных шаблонов, которые идентичны, за исключением охранников.
Далее: вам не нужно []@nlist
- это все равно, что просто написать nlist
.
Кроме того, похоже, что nlist@h
и подобные выражения пытаются объединить списки перед передачей их рекурсивному вызову; однако в OCaml приложение функции связывается более тесно, чем любой оператор, поэтому фактически добавляет результат рекурсивного вызова к h
.
У меня нет правильной версии функции. Но я хотел бы начать с написания защищенных шаблонов, а затем посмотреть, как далеко вы продвигаетесь в этом.