2014-05-17 100 views
12

我打算在矢量庫和注意到{-# INLINE_FUSED transform #-},我不知道它做什麼?我看到它在vector.h中定義,但沒有其他地方。INLINE_FUSED編譯哈斯克爾

回答

11

的定義是指INLINE_FUSED相同INLINE [1]; INLINE_INNERINLINE [0]相同。 [1][0]是用於排序內聯階段的標準ghc。請參閱標題7.13.5.5下的討論。相位控制 in http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

vector需要控制ghc內嵌各種定義的階段。第一它想要的功能streamunstream暴露所有用途,使得(上述全部)stream.unstream可以通過id在其他情況下取代,並且類似地,根據分佈在整個所述(改寫)RULE編譯指示。

典型向量到向量函數寫爲unstream . f . stream,其中f是一個流至流函數。 unstreamStream在內存中構建實際向量; stream將真實載體讀入Stream。遊戲的目標是減少構建的實際向量的數量。所以三個向量的組成向量函數

f_vector . g_vector . h_vector 

真的

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

其中他改寫,

unstream . f_stream . g_stream . h_stream . stream 

等。所以我們寫一個新的矢量而不是三個。

transform的規則比這個票友了一點,但在訂購的同一微妙系統屬於:

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

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

所以你可以看到什麼形式如何內聯:

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

被改寫。

+0

謝謝亞瑟,你已經解釋清楚了。 – jap