2015-11-26 10 views
17

Ich habe Probleme zu verstehen, wie UNPACK in Haskell funktioniert. Betrachten wir zum Beispiel die folgenden Daten Erklärungen:Was macht das UNPACK-Pragma in diesem Fall?

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

Wie wird T Datentyp ausgepackt werden?

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

: Wird es zu

data T' = T' !Int !Int 

oder werden die Int s weiter ausgepackt gleichwertig sein? Was ist mit

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

?

Antwort

17

Die GHC documentation beschreibt die UNPACK pragma wie folgt:

Der UNPACK dem Compiler anzeigt, dass er sollte den Inhalt eines Konstruktors Feld in den Konstruktor selbst, Entfernen eines Dereferenzierungsebene entpacken.


Wie werden Datentyp T ausgepackt werden?

data T = T (P Int Int) entspricht

non-unpacked data

Daher data T = T {-# UNPACK #-} !(P Int Int) zu

pair unpacked

Im Klartext entspricht, hat UNPACK den Inhalt des Konstruktors P in den Bereich der Konstruktor entpackt T, Entfernen einer Ebene der Indirektion und eines Konstruktor-Headers (P).

data T = T {-# UNPACK #-} !(P Int Int) ist nicht als "kompakt" als data T'' = T'' Int# Int#:

completely unpacked


Was

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

?

Ähnlich data U = U (P Int (P Int Int)) entspricht

pair of pairs

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

unpacked pair of pairs

Im Klartext hat UNPACK den Inhalt der Konstruktor P in den Bereich der Konstruktor entpackt U Entfernen einer Ebene der Indirektion und eines Konstruktor-Headers (P).

Ressourcen

+0

So gibt es keine Möglichkeit, 'T' zu' T''' heißt entfernen zwei Ebenen der Konstrukteure zu entpacken? –

+0

@Zeta Danke für die Bearbeitung. Wie haben Sie diese schönen Diagramme erstellt? TikZ? Die 'Diagramme'-Bibliothek? – Jubobs

+1

@Jubobs Sieht für mich wie GraphVis aus ... – MathematicalOrchid