Pragma {-# UNPACK #-}
mówi kompilatorowi, aby wyeliminować nadmiarowe konstruktory. Cytowanie Haskell wiki:Jak rozpakowanie ścisłych pól idzie w parze z polimorfizmem?
Na przykład, biorąc pod uwagę to:
data T = T {-# UNPACK #-} !(Int,Float)
GHC będzie reprezentować typ T tak:
data T = T Int Float
eliminując krotki. To jest powszechnie stosowany do wprowadzenia bez opakowania wskazówki bezpośrednio w konstruktorze:
data T = T {-# UNPACK #-} !Int
będą reprezentowane
data T = T Int#
Zastanawiałem się, czy to też działa, gdy pole być rozpakowywane jest polimorficzny ? Na przykład, jeśli zdefiniować
data S' a = S String {-# UNPACK #-} !a
type S1 = S' Int
newtype S2 = S2 (S' Int)
będą funkcje, które współpracują z S1
lub S2
zostać zoptymalizowana?