Tôi muốn tìm hiểu cách tạo biểu đồ và thực hiện một số thao tác cục bộ trên chúng trong Haskell, nhưng câu hỏi không dành riêng cho Haskell, và thay vì biểu đồ, chúng tôi có thể xem xét các danh sách được liên kết đôi.
Câu hỏi: Điều gì sẽ là một cách thành ngữ hoặc được đề xuất để thực hiện danh sách liên kết đôi (hoặc cấu trúc dữ liệu liên kết đôi hoặc liên kết đôi khác) và hoạt động trên ngôn ngữ đó chủ yếu hỗ trợ và ủng hộ các cấu trúc dữ liệu bất biến (Haskell, Clojure, v.v.) ? Cụ thể, làm thế nào để sử dụng các bản cập nhật tại chỗ, bị chính thức cấm bởi ngôn ngữ?
Tôi có thể dễ dàng tưởng tượng rằng nếu một số thao tác cục bộ được thực hiện trong danh sách được liên kết đôi (chẳng hạn nếu một mục được chèn), thì có thể không cần phải sao chép toàn bộ danh sách ngay lập tức do sự lười biếng của ngôn ngữ. Tuy nhiên, vì danh sách được liên kết đôi, nếu nó được sửa đổi ở một nơi, không có nút nào trong số các nút cũ có thể được sử dụng trong phiên bản mới của danh sách và chúng sẽ cần được đánh dấu, sao chép, thu gom rác sớm hay muộn . Rõ ràng đây là những hoạt động dư thừa nếu chỉ sử dụng bản sao cập nhật của danh sách, nhưng chúng sẽ thêm một "chi phí" tỷ lệ thuận với kích thước của danh sách.
Điều này có nghĩa là đối với các tác vụ như vậy, dữ liệu bất biến chỉ đơn giản là không phù hợp và các ngôn ngữ khai báo chức năng không có hỗ trợ "gốc" cho dữ liệu có thể thay đổi sẽ không tốt như dữ liệu bắt buộc? Hoặc, có một số cách giải quyết khó khăn?
Tái bút: Tôi đã tìm thấy một số bài báo và bài thuyết trình về chủ đề này trên Internet nhưng gặp khó khăn khi theo dõi chúng, trong khi tôi nghĩ rằng câu trả lời cho câu hỏi này không nên mất nhiều hơn một đoạn và có thể là một sơ đồ ... Ý tôi là, nếu có không có giải pháp "chức năng" cho vấn đề này, câu trả lời có lẽ là "sử dụng C". Nếu có một, thì nó có thể phức tạp như thế nào?
Câu hỏi liên quan
"Cấu trúc dữ liệu trong lập trình chức năng" . Câu hỏi cụ thể của tôi về việc sử dụng các bản cập nhật tại chỗ thay vì các giải pháp thay thế không hiệu quả không được thảo luận ở đó.
"Đột biến nội bộ của cấu trúc dữ liệu liên tục" . Có sự nhấn mạnh về việc triển khai ở mức độ thấp trong một ngôn ngữ không xác định, trong khi câu hỏi của tôi là về sự lựa chọn đúng đắn của ngôn ngữ (chức năng hoặc cách khác) và về các giải pháp thành ngữ có thể có trong các ngôn ngữ chức năng.
Trích dẫn có liên quan
Các ngôn ngữ lập trình chức năng thuần túy cho phép nhiều thuật toán được thể hiện rất chính xác, nhưng có một vài thuật toán trong đó trạng thái cập nhật tại chỗ dường như đóng một vai trò quan trọng. Đối với các thuật toán này, các ngôn ngữ hoàn toàn chức năng, thiếu trạng thái cập nhật, dường như không hiệu quả ( [Ponder, McGeer và Ng, 1988] ).
- John Launchbury và Simon Peyton Jones, chủ đề nhà nước chức năng lười biếng (1994), cũng là John Launchbury và Simon Peyton Jones, State in Haskell (1995). Các bài viết này giới thiệu ST
các nhà xây dựng loại đơn trong Haskell.
DiffArray
kiểu. Nhìn vào nguồn của gói diffarray , tôi thấy 91 lần xuất hiện unsafePerformIO
. Có vẻ như câu trả lời cho câu hỏi của tôi là "có, không, các ngôn ngữ chức năng thuần túy với dữ liệu bất biến không phù hợp để thực hiện các thuật toán thường dựa vào các bản cập nhật tại chỗ".
Map
, IntMap
hoặc HashMap
) như là một lưu trữ và để làm cho các nút chứa ID của các nút liên kết. "Tất cả các vấn đề trong khoa học máy tính có thể được giải quyết bằng một mức độ gián tiếp khác."