2011-11-14 33 views
21

Thư viện nào tồn tại để triển khai cấu trúc dữ liệu chặt chẽ? Cụ thể, tôi đang tìm kiếm các danh sách nghiêm ngặt và các bộ nghiêm ngặt.Thư viện cho cấu trúc dữ liệu chặt chẽ trong Haskell

Phủ nhận:

  1. tôi biết deepseq. Nó rất hữu ích, nhưng nó cho biết thêm chi phí vượt qua toàn bộ cấu trúc dữ liệu mỗi khi bạn sử dụng deepseq (có thể nhiều hơn một lần).

  2. Tôi biết rằng một cấu trúc dữ liệu chứa giống như nghiêm ngặt không đảm bảo tất cả mọi thứ nó chứa sẽ được đánh giá đầy đủ, nhưng cấu trúc bản thân nên nghiêm ngặt, ví dụ:

    data StrictList a = !a :$ !(StrictList a) | Empty 
    

    (Ở đây, các phần tử có trong WHNF và có thể không được đánh giá đầy đủ, nhưng cấu trúc của danh sách là. Ví dụ: danh sách vô hạn sẽ không có giá trị chấm dứt.)

  3. Tôi biết về gói 'nghiêm ngặt' về tấn công, nhưng nó có một giới hạn rất d tập hợp các cấu trúc dữ liệu chặt chẽ. Nó không chứa các danh sách và bộ không nghiêm ngặt .

  4. Viết danh sách nghiêm ngặt bản thân mình dường như amazingly dễ dàng (Tôi yêu mở rộng GHC của để lấy functor, traversable và có thể gập lại, btw.), Nhưng nó vẫn có vẻ như nó sẽ là thực hiện tốt hơn trong một thư viện riêng. Và triển khai hiệu quả các bộ dường như không tầm thường đối với tôi.

+0

Tại sao bạn cần cấu trúc chặt chẽ? – fuz

+1

@FUZxxl đảm bảo rằng mọi thứ được đánh giá không chậm trễ thường có thể giảm mức sử dụng không gian và làm cho việc tính toán nhanh hơn nhiều. Nó cũng có thể có hiệu ứng ngược lại, vì vậy cấu trúc lười biếng cũng rất quan trọng. Đối với mã hiệu quả, bạn cần cả hai (và phải biết/tìm ra để sử dụng ở đâu). –

+0

@FUZxxl: Tôi đang thực hiện những việc giống như một tiểu bang giống như trên một Bộ nơi tôi sẽ chèn và xóa các phần tử từ tập hợp rất thường xuyên nhưng không đánh giá Set trong một thời gian. Điều này dẫn đến rò rỉ không gian, có thể được cố định bởi cấu trúc dữ liệu cột sống (nhờ, John L). – shahn

Trả lời

13

Các containers gói (vận chuyển với GHC) sẽ sớm có Set và Bản đồ biến thể nghiêm ngặt (Tôi không chắc chắn họ sẽ được bao gồm với GHC-7.4, nhưng có lý do để hy vọng). Vì vậy, việc triển khai hiệu quả các Bộ và Bản đồ nghiêm ngặt đang được thực hiện. Danh sách nghiêm ngặt là, như bạn nói dễ dàng, vẫn còn một gói về hackage cung cấp cho họ sẽ được tốt đẹp, do đó, không phải tất cả mọi người phải làm điều đó bản thân. Bạn cần gì nữa?

+0

Âm thanh tuyệt vời.Danh sách và Bộ là tất cả những gì tôi cần (hiện tại). – shahn

7

Đối với điểm thứ hai của bạn, cụm từ tôi thấy thường xuyên nhất là cột sống nghiêm ngặt.

Đối với danh sách cột sống nghiêm ngặt, bạn có thể sử dụng Data.Seq.Sequence (từ vùng chứa) hoặc Data.Vector (từ vector). Không ai là một danh sách, tuy nhiên tùy thuộc vào những gì bạn đang làm một (hoặc cả hai) có thể sẽ tốt hơn. Trình tự cung cấp O (1) khuyết điểm và snoc, với khả năng truy cập rất nhanh vào một trong hai đầu của cấu trúc. Hiệu suất của Vector tương tự như một mảng. Nếu bạn muốn có giao diện giống như danh sách hơn Sequence, bạn có thể xem gói ListLike (có giao diện ListLike cho vectơ nữa, nhưng nó ít hữu ích hơn vì Vector cung cấp giao diện khá toàn diện). Cả hai đều cột sống nghiêm ngặt.

Đối với các bộ nghiêm ngặt, bạn có thể thử unordered-containers, cũng cung cấp bản đồ chặt chẽ.

+0

Đó là lời khuyên tốt. – shahn

+1

Có nghĩa là cột sống nghiêm ngặt, các yếu tố đó sẽ được đánh giá là WHNF (như trong ví dụ StrictList của tôi ở trên)? Vì vậy, bạn có thể loại bỏ dấu chấm than đầu tiên và vẫn gọi nó là cột sống nghiêm ngặt không? – shahn

+1

@shahn: cột sống nghiêm ngặt có nghĩa là cấu trúc của vùng chứa sẽ được đánh giá đầy đủ, nhưng các yếu tố có thể không được đánh giá. Vì vậy, có, bạn có thể xóa dấu chấm than đầu tiên trong ví dụ của mình và vẫn cột sống nghiêm ngặt. –

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