Я не уверен, как удалить циклы из изменяемого списка типа:
type 'a m_list = Nil | Cons of 'a * (('a m_list) ref)
Например. если бы у меня был список 3,2,2,1,2,1,2,1,..... я бы хотел получить 3,2,2,1.
Что я не могу понять - это местоположение начального цикла - у меня есть рекурсия, которая выглядит так, но я не могу понять, как обернуть ее в рекурсивную функцию; очевидно, здесь он просто проверит первые несколько терминов.
let remove list : unit =
if is_cyclic list then match list with
|Nil->()
|Cons(_,v)-> match (!v) with
|Nil->()
|Cons(_,x)->match (!x) with
|Nil->()
|Cons(_,y)->match (!y) with
|Nil->()
|Cons(_,p) -> if is_cyclic (!p) then p:=Nil else ()
У меня есть функция is_cycle, которая сообщает мне, есть ли у m_list цикл или нет. Я хотел бы сделать это либо деструктивно (обновив ссылку), либо недеструктивно (создав новый список).
Спасибо!