Вы можете использовать набор уже увиденных строк:
module StringSet = Set.Make(String)
let uniquify list =
let rec iter acc set list =
match list with
| [] -> List.rev acc
| s :: tail ->
if StringSet.mem s set then
iter acc set tail
else
iter (s :: acc) (StringSet.add s set) tail
in
iter [] StringSet.empty list
Первая строка определяет тип набора строк.
Затем uniquify вызывает вспомогательную функцию, чтобы либо добавить невидимую строку в список и набор, либо просто отбросить строку. acc
используется, чтобы сделать хвост итерации рекурсивным (и, таким образом, избежать переполнения стека в длинных списках).
Использование этой схемы лучше, так как сложность в O (N.log N) вместо N².