2015-11-26 12 views
17

Ho difficoltà a capire come funziona UNPACK in Haskell. consideri, ad esempio, le seguenti dichiarazioni di dati:Che cosa fa il pragma di UNPACK, in questo caso?

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

Come sarà DATATYPE T essere disfatto? Sarà equivalente a

data T' = T' !Int !Int 

o saranno le Int s essere ulteriormente decompresso:

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

? Che dire di

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

?

risposta

17

Il GHC documentation descrive la UNPACK pragma come segue:

La UNPACK indica al compilatore che dovrebbe decomprimere il contenuto di un campo costruttore al costruttore stesso, eliminando un livello di riferimento indiretto.


Come sarà DATATYPE T essere imballati?

data T = T (P Int Int) corrisponde

non-unpacked data

Pertanto, data T = T {-# UNPACK #-} !(P Int Int) corrisponde

pair unpacked

In parole semplici, UNPACK ha decompresso il contenuto del costruttore P nel campo della costruzione T, rimuovendo un livello di riferimento indiretto e un'intestazione del costruttore (P).

data T = T {-# UNPACK #-} !(P Int Int) non è così "compatto", come data T'' = T'' Int# Int#:

completely unpacked


Che dire

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

?

Analogamente, data U = U (P Int (P Int Int)) corrisponde

pair of pairs

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

unpacked pair of pairs

In parole semplici, UNPACK ha decompresso il contenuto del costruttore P nel campo della costruzione U , rimuovendo un livello di riferimento indiretto e un'intestazione del costruttore (P).

Risorse

+0

Quindi, non v'è alcun modo per disfare 'T' a' T''' vale a dire rimuovere due livelli di costruttori? –

+0

@Zeta Grazie per la modifica. Come hai prodotto quei bellissimi diagrammi? TikZ? La libreria 'diagrams'? – Jubobs

+1

@Jubobs Mi sembra GraphVis per me ... – MathematicalOrchid