2012-10-27 18 views
14

Pragma {-# UNPACK #-} mówi kompilatorowi, aby wyeliminować nadmiarowe konstruktory. Cytowanie Haskell wiki:Jak rozpakowanie ścisłych pól idzie w parze z polimorfizmem?

Na przykład, biorąc pod uwagę to:

data T = T {-# UNPACK #-} !(Int,Float) 

GHC będzie reprezentować typ T tak:

data T = T Int Float 

eliminując krotki. To jest powszechnie stosowany do wprowadzenia bez opakowania wskazówki bezpośrednio w konstruktorze:

data T = T {-# UNPACK #-} !Int 

będą reprezentowane

data T = T Int# 

Zastanawiałem się, czy to też działa, gdy pole być rozpakowywane jest polimorficzny ? Na przykład, jeśli zdefiniować

data S' a = S String {-# UNPACK #-} !a 

type S1  = S' Int 
newtype S2 = S2 (S' Int) 

będą funkcje, które współpracują z S1 lub S2 zostać zoptymalizowana?

Odpowiedz

11

Cytując Dona blog o rozpakowanie

To nie ma sensu dla pól polimorficznych, ponieważ mają zmienny rozmiar, a kompilator nie (z wyjątkiem bardzo szczególnych okolicznościach) mają dostęp do informacji o tym, co rodzaje są w użyciu.

Możesz również przeczytać listę Tibell reply na liście mailingowej.

Niestety rozpakowanie nie działa na polach polimorficznych (nowe ostrzeżenie dla nieefektywnych rozpakować pragma w GHC głowie powinien ostrzegać o tym) ...

Powiązane problemy