Прагма {-# UNPACK #-}
сообщает компилятору исключить избыточные конструкторы. Цитирование Haskell wiki:
Например, учитывая это:
data T = T {-# UNPACK #-} !(Int,Float)
GHC будет представлять тип T следующим образом:
data T = T Int Float
устранение кортежа. Это обычно используется для помещения unboxed Ints непосредственно в конструктор:
data T = T {-# UNPACK #-} !Int
будет отображаться как
data T = T Int#
Мне было интересно, работает ли это, когда поле для распаковки является полиморфным? Например, если я определяю
data S' a = S String {-# UNPACK #-} !a
type S1 = S' Int
newtype S2 = S2 (S' Int)
будут выполняться функции, оптимизирующие работу с S1
или S2
?