haskell indirection

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

?