Từ những gì tôi hiểu, loại danh sách trong Haskell được thực hiện nội bộ bằng cách sử dụng một danh sách liên kết. Tuy nhiên, người dùng của ngôn ngữ không nhận được để xem chi tiết của việc thực hiện, cũng không có khả năng sửa đổi "liên kết" tạo nên danh sách liên kết để cho phép nó trỏ đến một địa chỉ bộ nhớ khác. Điều này, tôi cho rằng, được thực hiện nội bộ.Danh sách trong Haskell: loại dữ liệu hoặc loại dữ liệu trừu tượng?
Sau đó, loại danh sách có thể đủ điều kiện như trong Haskell không? Đây có phải là "kiểu dữ liệu" hay "kiểu dữ liệu trừu tượng" không? Và loại danh sách được liên kết nào của việc triển khai?
Ngoài ra, do loại danh sách do Prelude cung cấp không phải là loại danh sách được liên kết, các hàm danh sách liên kết cơ bản có thể được triển khai như thế nào?
Lấy ví dụ, đoạn mã này được thiết kế để thêm một yếu tố một lúc chỉ số n của một danh sách:
add [] acc _ _ = reverse acc
add (x:xs) acc 0 a = add xs (x:a:acc) (-1) a
add (x:xs) acc n a = add xs (x:acc) (n-1) a
Sử dụng một "thực" danh sách liên kết, thêm một yếu tố sẽ chỉ bao gồm sửa đổi một con trỏ đến một địa chỉ bộ nhớ. Điều này là không thể trong Haskell (hoặc là nó?), Do đó câu hỏi: là việc thực hiện của tôi thêm một yếu tố vào một danh sách tốt nhất có thể, hoặc tôi thiếu một cái gì đó (việc sử dụng các chức năng reverse
là, tôi nghĩ rằng, đặc biệt là xấu xí, nhưng nó có thể làm mà không có?)
Xin vui lòng, đừng ngần ngại sửa tôi nếu bất cứ điều gì tôi đã nói là sai, và cảm ơn bạn đã dành thời gian của bạn.
Chào mừng bạn đến với StackOverflow! Câu hỏi đầu tiên tuyệt vời. – Sampson
http://en.wikibooks.org/wiki/Haskell/List_processing –
Nhờ mọi người đã trả lời câu hỏi của tôi, và mặc dù tôi chỉ có thể đánh dấu một trong số họ là "câu trả lời được chấp nhận" của tôi, tất cả các bạn đều rất hữu ích. – CharlieP