2011-09-26 26 views
15

Có ai có thể giải thích cho tôi tại sao không có kiểu dữ liệu Set được xác định trong Haskell không?Tại sao không có kiểu dữ liệu Thiết lập sẵn trong Haskell?

Sidenote: Tôi chỉ học Haskell như một phần của khóa học về logic trong đó lý thuyết tập hợp rất quan trọng vì vậy sẽ rất tiện dụng để có khái niệm về một bộ trong Haskell. Có một danh sách và loại bỏ các bản sao (và có thể phân loại) sẽ dẫn đến một bộ là tốt nhưng tôi tò mò nếu có một lý do cụ thể tại sao nó không được xây dựng trong?

+3

** Lưu ý của người kiểm duyệt ** Nhận xét trong câu hỏi này chủ yếu là tiếng ồn hoặc phản ứng với tiếng ồn và chúng đã bị xóa. Xin vui lòng giữ ý kiến ​​xây dựng và về chủ đề. –

+0

Tôi thấy câu trả lời/nhận xét đề xuất việc sử dụng danh sách thay thế. một danh sách không phải là một sự thay thế hiệu quả cho bộ. thời gian để tìm một phần tử trong một danh sách không theo thứ tự tăng lên với kích thước của danh sách, trong một tập hợp, được mong đợi là không đổi. – ribamar

Trả lời

26

Khi câu trả lời khác cho biết, câu hỏi "Tại sao không có loại dữ liệu Đặt trong Haskell?" bị sai hướng: there is a Set data type.

Nếu bạn muốn biết tại sao Set không được "tích hợp" cho Haskell, bạn có thể hỏi một trong hai điều.

  • Tại sao Set không phải là một phần của language specification?
  • Tại sao Set không ở trong Prelude (các hàm và kiểu dữ liệu được nhập theo mặc định)?

Để trả lời câu hỏi trước, đó là vì ngôn ngữ đủ mạnh để thể hiện ý tưởng của một bộ mà không cần phải nướng. Đó là ngôn ngữ có trọng tâm cao về lập trình hàm, cú pháp đặc biệt cho bộ và danh sách được tích hợp sẵn, nhưng thậm chí các kiểu dữ liệu đơn giản như Bool được định nghĩa trong Prelude.

Để trả lời câu hỏi sau, tốt, một lần nữa, với sự nhấn mạnh vào lập trình hàm, hầu hết các Haskeller có xu hướng sử dụng danh sách. Danh sách đơn nguyên thể hiện sự lựa chọn không xác định, và bằng cách cho phép các bản sao, bạn có thể sắp xếp thể hiện các lựa chọn có trọng số.

Lưu ý how similar list comprehension syntax is to set notation. Bạn luôn có thể sử dụng Set.fromList để chuyển đổi danh sách thành bộ "thực", nếu cần. Như một lời thốt lên với Barry, điều này sẽ tương tự như sử dụng phương thức set() của Python; Python cũng có khả năng hiểu danh sách.

+0

Về mặt kỹ thuật, 'Data.Set' nằm trong GHC, nhưng nó không nằm trong báo cáo Haskell 98 hoặc 2010 – user102008

+0

@ user102008" trong GHC "? Nó nằm trong [gói thùng chứa] (http://hackage.haskell.org/package/containers), được bao gồm trong [Haskell Platform] (http://hackage.haskell.org/platform/), nhưng tôi ' m không chắc chắn những gì bạn có nghĩa là bằng cách nói rằng nó là "trong GHC". –

+0

@DanBurton tốt, gói 'containers' _ships_ với GHC, ngay cả khi bạn không có Nền tảng. – ivanm

9

Nó tồn tại dưới dạng Data.Set. Tuy nhiên, như bạn đã nói, nó có thể được thực hiện trên đầu trang của list và vì vậy không phải là cần thiết để xây dựng ngôn ngữ mà tôi nghĩ là tại sao nó nằm trong mô-đun chứ không phải là một phần của định nghĩa ngôn ngữ.

+0

Vâng, danh sách cũng có thể được xác định bằng cách sử dụng những thứ khác ... –

+0

@DietrichEpp có nhưng cú pháp sẽ thực sự nặng nếu bạn thêm vào danh sách viết như một chuỗi rõ ràng của Cons. – mb14

+1

@ mb14 '(:) == Cons'; chỉ có cú pháp cú pháp cho các danh sách hữu hạn rõ ràng và các trình bao bọc xung quanh các hàm 'enum {From} {Then} {To}' khác nhau. – ivanm

11

Trên một cấp độ triết học hơn --- không bao giờ có thể là một sự tương ứng chặt chẽ giữa khái niệm toán học của một tập hợp và thực hiện bộ Haskell. Tại sao không? Vâng, hệ thống kiểu, cho người mới bắt đầu. Một tập hợp toán học có thể có bất kỳ thứ gì trong đó: {x | x is a positive integer, i < 15} là một tập hợp, nhưng như vậy là {1, tree, ham sandwich}. Trong Haskell, Set a sẽ cần giữ một số loại cụ thể. Đưa đôi và nổi vào cùng một bộ sẽ không đánh máy.

Như những người khác đã nói, nếu bạn cần phải làm một số điều giống như thiết lập và không nhớ loại hạn chế, Data.Set tồn tại. Nó không có trong Prelude vì danh sách thường thực tế hơn. Nhưng thực sự, từ một quan điểm thiết kế ngôn ngữ, nó không có ý nghĩa để nghĩ về các bộ toán học như một kiểu dữ liệu trong số rất nhiều. Bộ là cơ bản hơn thế. Bạn không có bộ, số và danh sách; bạn có bộ số và tập hợp danh sách. Sức mạnh của các loại đệ quy có khuynh hướng che khuất sự phân biệt đó, nhưng nó vẫn còn thực.

Có một vị trí trong Haskell, tuy nhiên, nơi chúng tôi xác định các bộ sưu tập tùy ý và sau đó xác định các hàm trên các bộ sưu tập đó. Các tương tự gần nhất của khái niệm toán học của bộ trong Haskell là hệ thống loại chính nó.

+1

Rất nhiều lần, tập hợp trong toán học được xem xét trong bối cảnh của một "vũ trụ" (http://en.wikipedia.org/wiki/Universe_(mathematics)) – user102008

+0

@Zopa: bạn vẫn có thể diễn tả rằng bằng cách sử dụng một tổng kiểu. – ivanm

+0

Đó là sự thật, như bạn nói, rằng "trong Haskell, một' Đặt a' sẽ cần phải giữ một số loại cụ thể ". Nhưng loại 'a' được khởi tạo tại có thể là một kiểu tồn tại, trong đó' 1', 'tree' và' ham sandwich' có thể là thành viên, giả sử 'tree' và' ham sandwich' là chính chúng. các thuật ngữ ... những gì bạn có thể làm một cách có ý nghĩa với một bộ như vậy tôi không có ý tưởng;) Tuy nhiên tôi đồng ý với kết luận của bạn, rằng _types mình_ là điều gần nhất Haskell có khái niệm toán học của các bộ. –

Các vấn đề liên quan