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
UNPACKindica 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))
?