2012-04-18 56 views
5

Tôi thường thu thập nhiều giá trị trong bộ dữ liệu, vì tôi coi tuples là loại tự nhiên cho điều này. Tuy nhiên, tuples không nghiêm ngặt. Vì vậy, hãy xem xétUNPACKs lồng nhau trong GHC

data A 

data B = 
    B !A 

data C = 
    C !(B, B) 

data D = 
    D !B !B 

Với -funbox-strict-fields và tối ưu hóa, UNPACK được lồng vào nhau. Bộ tách trong số C có được mở thành C A A như với D hoặc chỉ C B B không? Đây là tài liệu tham khảo trong GHC-doc: 7.16. Pragmas.

(là các tuple không trống loại kiểu nhà xây dựng?)

Trả lời

6

xem xét:

data B = B !Int 

data C = C !(B, B) 

data D = D !B !B 

b0 = B 7 
b1 = B 4 

c = C (b0, b1) 

d = D b0 b1 

nơi

data (,) a b = (a,b) 

GHC sẽ hạnh phúc Erase lồng nhau, nhà xây dựng nghiêm ngặt (!B), và nó sẽ làm cho C nghiêm ngặt trong lĩnh vực đầu tiên của nó, tối ưu hóa:

b0 = B 7 
b1 = B 4 

c = C b0 b1 

d = D 7 4 

Tuy nhiên, quan trọng là các trường (,) không chính xác - vì vậy GHC không thể giải nén chúng. Hơn nữa, chúng đa hình, vì vậy nó không thể giải nén chúng ngay cả khi chúng nghiêm ngặt.

Một công việc xung quanh cho phần đầu tiên là sử dụng các bộ dữ liệu nghiêm ngặt. Cách giải quyết cho phần thứ hai là sử dụng self-specializing tuples (ví dụ: nhập các gia đình chuyên về bộ dữ liệu).


Lưu ý rằng việc sử dụng các bộ dữ liệu cho cú pháp theo kiểu này phát sinh chi phí - chúng giới thiệu mức độ thụ động cần được tối ưu hóa. Như vậy, nó là hơi unidiomatic.

+0

Tôi đã sửa lỗi trong câu hỏi của mình: dữ liệu B phải là dữ liệu B = B! A. Vì vậy, trong C tôi nên thay vì sử dụng loại hình chuyên biệt của riêng tôi, trong đó có lĩnh vực nghiêm ngặt, thay vì một tuple? Tôi hy vọng rằng GHC có thể tiếp tục giải nén sau khi tìm kiếm một bộ dữ liệu, vì vậy tôi không cần phải viết nhiều kiểu dữ liệu chuyên biệt cho mỗi trường. (Nhưng, vì tôi thu thập các giá trị trong bộ dữ liệu, tôi có thể có một số ý tưởng trừu tượng về tập hợp các giá trị, vì vậy có lẽ tôi nên sử dụng một phiên bản chuyên biệt ...) – telephone

+0

Nếu các bộ dữ liệu không đa hình. Tôi đã viết về vấn đề này trước đây: http://donsbot.wordpress.com/2009/10/11/self-optimizing-data-structures-using-types-to-make-lists-faster/ –

+0

Như tôi thấy từ các ví dụ trong GHC-doc, một cặp được sử dụng như một trường nghiêm ngặt trong một kiểu dữ liệu sẽ được làm phẳng. – telephone