2015-11-26 12 views
17

Tôi gặp khó khăn khi hiểu cách UNPACK hoạt động trong Haskell. Xem xét, ví dụ, tờ khai dữ liệu sau:Pragma UNPACK làm gì, trong trường hợp này?

data P a b = P !a !b 
data T = T {-# UNPACK #-} !(P Int Int) 

sẽ datatype T Làm thế nào được giải nén? nó sẽ tương đương với

data T' = T' !Int !Int 

hoặc Int s sẽ được tiếp tục giải nén:

data T'' = T'' Int# Int# 

? Điều gì về

data U = U {-# UNPACK #-} !(P Int (P Int Int)) 

?

Trả lời

17

Các GHC documentation mô tả các UNPACK pragma như sau:

Các UNPACK chỉ để trình biên dịch rằng nó nên giải nén các nội dung của một lĩnh vực xây dựng thành các nhà xây dựng chính nó, loại bỏ một mức gián tiếp.


sẽ datatype Làm thế nào T được giải nén?

data T = T (P Int Int) tương ứng với

non-unpacked data

Do đó, data T = T {-# UNPACK #-} !(P Int Int) tương ứng với

pair unpacked

Trong tiếng Anh đơn giản, UNPACK đã giải nén các nội dung của constructor P vào lĩnh vực xây dựng T, loại bỏ một mức độ đầu dòng vô hướng và một hàm khởi tạo (P).

data T = T {-# UNPACK #-} !(P Int Int) không phải là "nhỏ gọn" như data T'' = T'' Int# Int#:

completely unpacked


gì về

data U = U {-# UNPACK #-} !(P Int (P Int Int)) 

?

Tương tự, data U = U (P Int (P Int Int)) tương ứng với

pair of pairs

data U = U {-# UNPACK #-} !(P Int (P Int Int)) tương ứng với

unpacked pair of pairs

Trong tiếng Anh đơn giản, UNPACK đã giải nén các nội dung của constructor P vào lĩnh vực xây dựng U , loại bỏ một mức độ đầu dòng và một tiêu đề hàm dựng (P).

Tài

+0

Vì vậy, không có cách nào để giải nén 'T' cho 'T''' ví dụ: loại bỏ hai cấp độ của nhà xây dựng? –

+0

@Zeta Cảm ơn bạn đã chỉnh sửa. Bạn đã tạo ra những sơ đồ đẹp như thế nào? TikZ? Thư viện 'diagrams'? – Jubobs

+1

@Jubobs Hình như GraphVis với tôi ... – MathematicalOrchid

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