Recently tôi được giới thiệu đến this OCaml code mà trong Haskell có thể được viết như sau:danh sách chức năng thuần túy "True" kép liên kết và chia sẻ của các nút
data DL a = DL [a] a [a]
create [] = error "empty list"
create (x:xs) = DL [] x xs
next (DL pr x (h:tl)) = DL (x:pr) h tl
next _ = error "end of dlist"
prev (DL (p:pr) x tl) = DL pr p (x:tl)
prev _ = error "start of dlist"
mà tôi mặc dù đã không một danh sách gấp đôi liên kết thích hợp triển khai, vì nó tạo lưu trữ mới trên truyền tải. OTOH có this Haskell code:
data DList a = Leaf | Node { prev::(DList a), elt::a, next::(DList a) }
create = go Leaf
where go _ [] = Leaf
go prev (x:xs) = current
where current = Node prev x next
next = go current xs
Chúng ta có thể nói rằng nó là chỉ này đang đó là đúng dl-list?
Chúng tôi có thể dựa vào mã này để giới thiệu chia sẻ thực sự các nút của danh sách dl không, do đó không có bộ nhớ mới nào được tạo trên truyền tải?
Sản phẩm biến có cùng tên trong Haskell luôn đề cập đến cùng "điều" hoặc có thể tách các lần xuất hiện của biến cùng tên tham khảo bản sao riêng của điều tương tự? (chỉnh sửa để thêm nhấn mạnh).
Triển khai đầu tiên là cái được gọi là _Zipper_; cho là nó có thể được cho một trong hai danh sách đơn lẻ hoặc liên kết kép. Tuy nhiên, nó không phải là một danh sách thực hiện theo đúng nghĩa của nó. – ivanm
Nếu bạn đọc kỹ báo cáo Haskell, bạn không thể tìm thấy một đoạn văn nào về cách dữ liệu được biểu diễn. Xin lưu ý rằng mọi loại chia sẻ đều phụ thuộc vào việc triển khai, mặc dù chủ yếu chỉ có một vài cách hợp lý để triển khai một tính năng nhất định. – fuz
Cảm ơn bạn về câu hỏi này! Tôi đã không hài lòng với tôi, theo dõi điều này. – demi