Прагма {-# UNPACK #-}
указывает компилятору исключить избыточные конструкторы. Цитирование Вики Haskell:
Например, учитывая это:
data T = T {-# UNPACK #-} !(Int,Float)
GHC будет представлять тип T следующим образом:
data T = T Int Float
устранение кортежа. Это обычно используется для помещения неупакованного Int непосредственно в конструктор:
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
?