Как распаковывать строгие поля вместе с полиморфизмом?
Прагма {-# 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
?
Ответы
Ответ 1
Цитата из Don блог о распаковке
Это не имеет смысла для полиморфных полей, поскольку они имеют переменный размер, а компилятор не имеет (за исключением особых обстоятельств) доступа к информации о том, какие типы используются.
Также вы можете прочитать Tibell ответ в список рассылки.
К сожалению, распаковка не работает для полиморфных полей (новое предупреждение для неэффективных распаковки прагм в голове GHC должно предупредить об этом)...