Как распаковывать строгие поля вместе с полиморфизмом? - программирование

Как распаковывать строгие поля вместе с полиморфизмом?

Прагма {-# 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?

4b9b3361

Ответ 1

Цитата из Don блог о распаковке

Это не имеет смысла для полиморфных полей, поскольку они имеют переменный размер, а компилятор не имеет (за исключением особых обстоятельств) доступа к информации о том, какие типы используются.

Также вы можете прочитать Tibell ответ в список рассылки.

К сожалению, распаковка не работает для полиморфных полей (новое предупреждение для неэффективных распаковки прагм в голове GHC должно предупредить об этом)...