2014-05-17 13 views
12

Przechodzę przez bibliotekę wektorów i zauważyłem {-# INLINE_FUSED transform #-} i zastanawiałem się, co robi? Widzę go zdefiniowany w vector.h, ale nigdzie indziej.INLINE_FUSED pragma w Haskell

Odpowiedz

11

Definicje oznaczają, że INLINE_FUSED jest taki sam jak INLINE [1]; INLINE_INNER jest taki sam jak INLINE [0]. Modele [1] i [0] to standardowe ghc do zamawiania faz inline. Zobacz dyskusję pod nagłówkiem 7.13.5.5. Kontrola fazy w

vector musi kontrolować etapy, w których ghc wprowadza różne definicje. Najpierw chce się ujawnić wszystkie funkcje funkcji, aby (przede wszystkim) stream.unstream można było zastąpić przez id, i podobnie w innych przypadkach, zgodnie z (przepisanymi) zasadami ROZPAMI rozproszonymi w całym tekście.

Typowy wektor do funkcji wektorowych jest zapisany jako unstream . f . stream, gdzie f jest funkcją Stream to Stream. unstream buduje rzeczywisty wektor w pamięci z Stream; stream odczytuje prawdziwy wektor do Stream. Celem gry jest zmniejszenie liczby wbudowanych rzeczywistych wektorów. Tak więc skład wektora na wektor trzy funkcje

f_vector . g_vector . h_vector 

jest naprawdę

unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream 

którym jego przepisany do

unstream . f_stream . g_stream . h_stream . stream 

i tak dalej. Tak więc piszemy jeden nowy wektor zamiast trzech.

Zasady transform są nieco bardziej wyszukane niż ten, ale należą do tego samego subtelnego systemu zamawiającego:

transform f g (unstream s) = unstream (Bundle.inplace f g s) 
transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p 

w https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76

więc można zobaczyć, jak coś inlined w formie:

unstream . h_stream . stream . transform f1 g1 . transform f2 g2 
        . unstream . j_stream . stream $ input_vector 

zostanie przepisany.

+0

Dziękuję, Arthur, wyjaśniłeś to bardzo wyraźnie. – jap