Как распаковка строгих полей сочетается с полиморфизмом?

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


person Petr    schedule 27.10.2012    source источник


Ответы (1)


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

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

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

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

person Satvik    schedule 27.10.2012