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
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.
Dziękuję, Arthur, wyjaśniłeś to bardzo wyraźnie. – jap