2012-09-03 18 views
14

हम तोमैं एक ही सूची में दो मानचित्र कैसे फ्यूज कर सकता हूं?

unzip (map (\x -> (f x, g x)) xs) 

की तरह अभिव्यक्ति

(map f xs, map g xs) 

में सूची xs पर दो traversals फ्यूज सकता स्वचालित रूप से संलयन इस तरह का प्रदर्शन कर रहा पर किसी भी reasearch है?

(वहाँ एक जोखिम यहाँ एक अंतरिक्ष रिसाव बनाने के लिए करता है, तो वापस आ सूचियों में से एक अन्य से पहले सेवन किया जाता है है मैं अंतरिक्ष की बचत की तुलना में xs पर अतिरिक्त ट्रेवर्सल को रोकने में अधिक दिलचस्पी रखता हूँ।।)

संपादित करें: मैं वास्तव में वास्तविक इन-मेमोरी हास्केल सूचियों में संलयन लागू नहीं कर रहा हूं, जहां यह परिवर्तन इस बात पर निर्भर नहीं हो सकता है कि unzip को इसके उपभोक्ता के साथ जोड़ा जा सकता है या नहीं। मेरे पास एक सेटिंग है जहां मुझे पता है कि unzip फ्यूज कर सकता है (देखें "फ्लूम जावा: आसान, कुशल डेटा-समांतर पाइपलाइन")।

+2

स्वचालित नहीं है, लेकिन वैसे भी अच्छा है: http://squing.blogspot.com/2008/11/beautiful-folding.html –

+1

जब तक कुछ और चीज़ों के साथ इस फ़्यूज़ का परिणाम जोड़े को बनाने और उन्हें अनजिप करने का ओवरहेड न हो अतिरिक्त ट्रैवर्सल की लागत से बड़ा हो। – augustss

+1

@augustss नहीं अगर ट्रैवर्सल एक बड़ी फाइल पर है! मैं इसे वास्तविक सूचियों पर लागू करने की योजना नहीं बना रहा हूं। – tibbe

उत्तर

4

भी पूरी तरह से स्वचालित नहीं है, लेकिन आप जीएचसी को इस तरह के पुनर्लेखन नियमों की एक सूची दे सकते हैं। 7.14 Rewrite rules और Using rules देखें। फिर कंपाइलर संकलन करते समय अपने प्रोग्राम को अनुकूलित करने के लिए इन नियमों का उपयोग करता है। (ध्यान दें कि कोई रास्ता नहीं की जाँच में संकलक नियम कोई मतलब है।)

संपादित करें: इस विशेष समस्या के लिए एक उदाहरण देने के लिए, हम लिख सकते हैं:

{-# OPTIONS_GHC -fenable-rewrite-rules -ddump-rule-firings -ddump-rule-rewrites #-} 

import Data.Char 

{-# RULES 
"map/zip" forall f g xs. (,) (map f xs) (map g xs) = unzip (map (\x -> (f x, g x)) xs) 
    #-} 

main :: IO() 
main = let x = "abCD" in 
     print $ (,) (map toUpper x) (map toLower x) 

(उच्च-स्तर नियम में फ़ंक्शन नाम (,) :: a -> b -> (a, b) है)। संकलन करते समय, आप देखेंगे कि नियम कैसे लागू होते हैं। विकल्प dump-rule-firings एक नियम लागू होने पर एक संदेश दिखाता है और -ddump-rule-rewrites प्रत्येक नियम एप्लिकेशन को विस्तार से प्रदर्शित करता है - 7.14.6. Controlling what's going on in rewrite rules देखें।

जोसेफ Svenningsson:

+0

मुझे नहीं लगता कि हम इस तरह के अभिव्यक्तियों से मेल खाने के लिए एक नियम लिख सकते हैं। जीएचसी नियमों को एक समारोह के नाम से शुरू होना चाहिए। – tibbe

3

मैं दो संसाधन है कि संलयन (संयुक्त राष्ट्र) का उल्लेख है कार्यों की तरह ज़िप, कम से कम कुछ समय के लिए खोजने के लिए प्रबंधित किया है। "पैरामीटर & पिन की तरह कार्य जमा के लिए शॉर्टकट फ्यूजन" http://www.cse.chalmers.se/~josefs/publications/fusion.pdf

डंकन काउट्स। "स्ट्रीम फ़्यूज़न: कॉंडक्टक्टिव शॉर्टकट फ़्यूज़न के लिए प्रैक्टिकल शॉर्टकट फ़्यूज़न" https://community.haskell.org/~duncan/thesis.pdf

न तो संसाधन इस तरह के "भाई संलयन" का स्पष्ट रूप से उल्लेख करते हैं।

+1

मुझे यह प्रस्तुति दिखाई नहीं दे रही है, लेकिन यहां [जोप्लेफ्यूजन] के बारे में जोसेफ की स्लाइडें हैं (http://wiki.portal.chalmers.se/cse/uploads/FP/Josef_TupleFusion.pdf)। – danr

+0

[स्वचालित टुपलिंग रणनीति के लिए] (http://dl.acm.org/citation.cfm?id=154643) दिलचस्प हो सकता है। –