2015-11-26 11 views
17

Mam problem ze zrozumieniem, jak działa UNPACK w Haskell. Rozważmy, na przykład, następujące deklaracje danych:Co robi pragma UNPACK, w tym przypadku?

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

Jak dataType T być rozpakowane? Będzie to równoznaczne z

data T' = T' !Int !Int 

lub będzie Int e być dalej rozpakowaniu:

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

? A co powiesz na:

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

?

Odpowiedz

17

GHC documentation opisuje UNPACK pragmy następująco:

UNPACK wskazuje kompilator, które powinny rozpakować zawartość pola konstruktora do samego konstruktora usuwania poziom pośredni.


Jak dataType T być rozpakowane?

data T = T (P Int Int) odpowiada

non-unpacked data

Dlatego data T = T {-# UNPACK #-} !(P Int Int) odpowiada

pair unpacked

Mówiąc wprost, UNPACK jest rozpakowaniu zawartości konstruktora P w polu konstruktora T, usuwając jeden poziom pośredni i jeden nagłówek konstruktora (P).

data T = T {-# UNPACK #-} !(P Int Int) nie jest tak "compact" jak data T'' = T'' Int# Int#:

completely unpacked


Co

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

?

Podobnie data U = U (P Int (P Int Int)) odpowiada

pair of pairs

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

unpacked pair of pairs

Mówiąc wprost, UNPACK jest rozpakowaniu zawartości konstruktora P w polu konstruktora U , usuwanie jednego poziomu pośredniego i jednego nagłówka konstruktora (P).

Resources

+0

Tak, nie ma sposobu, aby rozpakować 'T' do' T''' tj usunąć dwa poziomy konstruktorów? –

+0

@Zeta Dzięki za edycję. Jak stworzyłeś te piękne diagramy? TikZ? Biblioteka "diagramów"? – Jubobs

+1

@Jubobs Wygląda mi na GraphVis ... – MathematicalOrchid