Я не уверен, как удалить циклы из изменяемого списка типа:
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_cyclic, которая сообщает мне, есть ли в цикле m_list цикл или нет. Я хотел бы сделать это либо разрушительно (обновление ссылки), либо неразрушающе (создание нового списка).
Спасибо!