haskell - ¿Qué hace el pragma UNPACK, en este caso?
indirection (1)
La documentación de GHC describe el pragma UNPACK de la siguiente manera:
El
UNPACK
indica al compilador que debe desempaquetar el contenido de un campo constructor en el propio constructor, eliminando un nivel de direccionamiento indirecto.
¿Cómo se desempaquetará el tipo de datos
T
?
data T = T (P Int Int)
corresponden a
Por lo tanto, los data T = T {-# UNPACK #-} !(P Int Int)
corresponden a
En un lenguaje sencillo, UNPACK
ha desempaquetado los contenidos del constructor P
en el campo del constructor T
, eliminando un nivel de direccionamiento indirecto y un encabezado de constructor ( P
).
data T = T {-# UNPACK #-} !(P Int Int)
no es tan "compacta" como los data T'''' = T'''' Int# Int#
:
Qué pasa
data U = U {-# UNPACK #-} !(P Int (P Int Int))
?
De forma similar, los data U = U (P Int (P Int Int))
corresponden a
y los data U = U {-# UNPACK #-} !(P Int (P Int Int))
corresponden a
En un lenguaje sencillo, UNPACK
ha desempaquetado el contenido del constructor P
en el campo del constructor U
, eliminando un nivel de direccionamiento indirecto y un encabezado de constructor ( P
).
Recursos
Tengo problemas para entender cómo funciona UNPACK
en Haskell. Considere, por ejemplo, las siguientes declaraciones de datos:
data P a b = P !a !b
data T = T {-# UNPACK #-} !(P Int Int)
¿Cómo se desempaquetará el tipo de datos T
? ¿Será equivalente a
data T'' = T'' !Int !Int
o se desempaquetarán más los Int
s:
data T'''' = T'''' Int# Int#
? Qué pasa
data U = U {-# UNPACK #-} !(P Int (P Int Int))
?