Ответ 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
).