2015-11-26 1 views
17

J'ai de la difficulté à comprendre comment fonctionne UNPACK à Haskell. Tenir compte, par exemple, les déclarations de données suivantes:Que fait le pragma UNPACK, dans ce cas?

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

Comment va type_données T être déballés? Sera-ce équivalent à

data T' = T' !Int !Int 

ou seront les Int s être plus décompressée:

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

? Qu'en est-il de

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

?

Répondre

17

Le GHC documentation décrit la UNPACK pragma comme suit:

Le UNPACK indique au compilateur qu'il doit décompresser le contenu d'un champ constructeur dans le constructeur lui-même, la suppression d'un niveau d'indirection.


Comment va type_données T être déballés?

data T = T (P Int Int) correspond à

non-unpacked data

Par conséquent, data T = T {-# UNPACK #-} !(P Int Int) correspond à

pair unpacked

En clair, UNPACK a décompressé le contenu du constructeur P dans le champ du constructeur T, supprimant un niveau d'indirection et un en-tête de constructeur (P).

data T = T {-# UNPACK #-} !(P Int Int) est pas "compact" comme data T'' = T'' Int# Int#:

completely unpacked


Qu'en est-

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

?

De même, data U = U (P Int (P Int Int)) correspond à

pair of pairs

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

unpacked pair of pairs

En clair, UNPACK a décompressé le contenu du constructeur P dans le champ du constructeur U , supprimant un niveau d'indirection et un en-tête de constructeur (P).

Ressources

+0

Donc, il n'y a aucun moyen de déballer '' T' à T''' dire supprimer deux niveaux de constructeurs? –

+0

@Zeta Merci pour l'édition. Comment avez-vous produit ces beaux diagrammes? TikZ? La bibliothèque 'diagrammes'? – Jubobs

+1

@Jubobs Ressemble à GraphVis pour moi ... – MathematicalOrchid