2014-05-17 7 views
12

में INLINE_FUSED pragma मैं वेक्टर लाइब्रेरी पर जा रहा हूं और {-# INLINE_FUSED transform #-} पर ध्यान दिया और मैं सोच रहा था कि यह क्या करता है? मैं इसे vector.h में परिभाषित करता हूं लेकिन कहीं और नहीं।Haskell

उत्तर

11

परिभाषा का अर्थ है कि INLINE_FUSEDINLINE [1] जैसा ही है; INLINE_INNERINLINE [0] जैसा ही है। [1] और [0] इनलाइनिंग के चरणों को ऑर्डर करने के लिए मानक ghc हैं। शीर्षक 7.13.5.5 के तहत चर्चा देखें। चरण नियंत्रणhttp://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

vector में चरणों को नियंत्रित करने की जरूरत है जो ghc inlines विभिन्न परिभाषाओं पर। सबसे पहले यह stream और unstream कार्यों के सभी उपयोगों को उजागर करने के लिए चाहता है, ताकि (सभी के ऊपर) 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 के लिए नियमों को इस की तुलना में थोड़ा अधिक सजावटी रहे हैं, लेकिन आदेश के एक ही सूक्ष्म प्रणाली के साथ हैं:

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

में

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

ताकि आप देख सकते हैं कि कुछ के रूप में inlined:

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

फिर से लिखा जाएगा।

+0

धन्यवाद आर्थर, आपने इसे स्पष्ट रूप से समझाया है। – jap