2012-10-27 25 views
14

{-# UNPACK #-} pragma yêu cầu trình biên dịch loại bỏ các nhà thầu dự phòng. Trích dẫn Haskell wiki:Cách giải nén các trường nghiêm ngặt đi cùng với đa hình?

Ví dụ, đưa ra này:

data T = T {-# UNPACK #-} !(Int,Float) 

GHC sẽ đại diện cho loại T như thế này:

data T = T Int Float 

loại bỏ các tuple. Điều này thường được sử dụng để đưa Ints không có hộp bọc trực tiếp trong một constructor:

data T = T {-# UNPACK #-} !Int 

sẽ được biểu diễn như

data T = T Int# 

tôi đã tự hỏi, Điều này cũng làm việc khi lĩnh vực để được giải nén là đa hình ? Ví dụ, nếu tôi xác định

data S' a = S String {-# UNPACK #-} !a 

type S1  = S' Int 
newtype S2 = S2 (S' Int) 

sẽ chức năng làm việc với S1 hoặc S2 được tối ưu hóa?

Trả lời

11

Trích dẫn từ Don của blog về giải nén

Nó không có ý nghĩa đối với các lĩnh vực đa hình, vì chúng có kích thước thay đổi, và trình biên dịch không (trừ trường hợp rất cụ thể) được tiếp cận với thông tin về những loại đang được sử dụng.

Ngoài ra, bạn có thể đọc Tibell's reply vào danh sách gửi thư.

Đáng tiếc là giải nén không hoạt động cho các lĩnh vực đa hình (cảnh báo mới cho pragmas giải nén hiệu quả trong việc GHC đầu nên cảnh báo về điều này) ...

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