В этом случае
| h1::h2::t -> if h1=h2 then h2::(compress t) else h1::h2::(compress t) ;;
Вы не заметите дубликат, если h2
совпадает с заголовком t
. Вам нужно
передать (h2 :: t)
в рекурсивных вызовах на compress
.
Я написал эту функцию много раз (возможно, кандидат в стандартную библиотеку List). Вот как я обычно пишу это (избегая лишних минусов или двух):
let rec compress l =
match l with
| [] -> []
| [_] -> l
| h1 :: ((h2 :: _) as tail) ->
if h1 = h2 then compress tail else h1 :: compress tail
Это не хвостовая рекурсия, поэтому он занимает линейное количество стекового пространства. Это хорошо, если вы знаете, что ваши списки, как правило, довольно короткие.