Подтвердить что ты не робот

Что делает прагма UNPACK в данном случае?

Мне трудно понять, как UNPACK работает в Haskell. Рассмотрим, например, следующие объявления данных:

data P a b = P !a !b
data T = T {-# UNPACK #-} !(P Int Int)

Как будет распаковаться datatype T? Будет ли это эквивалентно

data T' = T' !Int !Int

или дальнейшая распаковка Int:

data T'' = T'' Int# Int#

? Что насчет

data U = U {-# UNPACK #-} !(P Int (P Int Int))

?

4b9b3361

Ответ 1

Документация GHC описывает прагму UNPACK следующим образом:

UNPACK указывает компилятору, что он должен распаковать содержимое поля конструктора в сам конструктор, удалив уровень косвенности.


Как будет распаковаться datatype T?

data T = T (P Int Int) соответствует

не распакованные данные

Следовательно, data T = T {-# UNPACK #-} !(P Int Int) соответствует

пара распакованных

На простом английском языке UNPACK распаковал содержимое конструктора P в поле конструктора T, удалив один уровень косвенности и один заголовок конструктора (P).

data T = T {-# UNPACK #-} !(P Int Int) не является "компактным" как data T'' = T'' Int# Int#:

полностью распакован


Что насчет

data U = U {-# UNPACK #-} !(P Int (P Int Int))

?

Аналогично, data U = U (P Int (P Int Int)) соответствует

пара пар

и data U = U {-# UNPACK #-} !(P Int (P Int Int)) соответствует

распакованная пара пар

На простом английском языке UNPACK распаковал содержимое конструктора P в поле конструктора U, удалив один уровень косвенности и один заголовок конструктора (P).

Ресурсы