ฉันไม่แน่ใจว่าจะลบวงจรออกจากรายการประเภทที่ไม่แน่นอนได้อย่างไร:
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 มีวงจรหรือไม่ ฉันต้องการทำสิ่งนี้แบบทำลายล้าง (อัปเดตข้อมูลอ้างอิง) หรือไม่ทำลายล้าง (สร้างรายการใหม่)
ขอบคุณ!