Saya tidak yakin bagaimana cara menghapus siklus dari daftar tipe yang bisa diubah:
type 'a m_list = Nil | Cons of 'a * (('a m_list) ref)
Misalnya. jika saya memiliki daftar 3,2,2,1,2,1,2,1,..... Saya ingin mendapatkan 3,2,2,1.
Yang tidak dapat saya pahami adalah lokasi perputaran awal--Saya memiliki rekursi yang terlihat seperti ini tetapi saya tidak tahu cara menggabungkannya menjadi fungsi rekursif; jelas di sini ini hanya akan memeriksa beberapa istilah pertama.
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 ()
Saya memiliki fungsi is_cyclic yang memberi tahu saya apakah m_list memiliki siklus atau tidak. Saya ingin melakukan ini secara destruktif (memperbarui referensi) atau secara tidak merusak (membuat daftar baru).
Terima kasih!