2012-02-08 18 views
6

मान लीजिए मेरे पास दो कार्य f :: [a] -> b और g :: [a] -> c हैं। अगर मैं प्रदर्शनक्या प्रस्तुत किए गए मामले को एक लूप में अनुकूलित किया जा सकता है?

  1. (f &&& g) xs जहां xs :: [a], और अगर दोनों f और g छोरों शामिल है, यह संभव संकलक के बाद इन दोनों छोरों का अनुकूलन करने के लिए है: मैं निम्नलिखित दो प्रश्न हैं? (कृपया ध्यान दें कि मैं नहीं पूछ रहा हूँ कुछ विशिष्ट हास्केल संकलक लागू करता है कि क्या यह। मैं जानना चाहता हूँ कि क्या ऐसी बात संभव है चाहता हूँ।)

  2. Traverse प्रकार वर्ग मदद से traverse समारोह मेरे साथ इस तरह के एक अनुकूलन हो सकता है निम्नलिखित लाइनों के साथ कुछ:

    traverse (someCombinator f g) xs 
    
+0

मुझे लगता है कि 1 में ऑप्टिमाइज़ेशन सुपरकंपेलर्स द्वारा किया जा सकता है। – Landei

उत्तर

9

यह, इस कोड का अनुकूलन करने के सैद्धांतिक रूप से संभव है, लेकिन बहुत बहुत मुश्किल है क्योंकि f और g इनपुट सूची से अलग-अलग उपयोग कर सकती है। केवल तभी जब वे एक ही राशि का उपभोग करते हैं, या g हमेशा f (या इसके विपरीत) की तुलना में अधिक सूची का उपभोग करता है, तो अनुकूलन करना संभव होगा। हल करने की समस्या एक संकलक को जटिल कोड में ऐसी स्थितियों का पता लगाने से रोकती है।

केवल साधारण मामलों में, जहां दोनों f और g उपयोग foldr आंतरिक रूप से, उदाहरण के लिए, यह संभव आगे आत्मनिरीक्षण के बिना तुच्छ ऑप्टिमाइज़ेशन करने के लिए किया जाएगा।

traverse समारोह तुम यहाँ मदद मिलेगी नहीं, someCombinator को लागू करने (आप कैसे गंभीर हैक्स के बिना एक [a] में a की की कई कॉल को बदलने के लिए चाहते हैं का कोई उचित तरीका है, क्योंकि? और फिर आप वापस आ रहे हैं तुम कहाँ शुरू कर दिया वैसे भी)।

आपका केवल वास्तविक विकल्प फ़ोल्डरों में f और g बनाने के लिए, ताकि वे हस्ताक्षर f :: a -> b -> b और g :: a -> c -> c है, जिसका अर्थ है कि b और c का मूल्य संवर्द्धित गणना की जा सकती है। फिर आप उस फ़ोल्डर को प्राप्त करने के लिए \ a -> f a *** g a का उपयोग कर सकते हैं जिसका उपयोग आप किसी पारंपरिक (दाएं- इस मामले में) में कर सकते हैं।

+0

ग्रेट उत्तर। आपका बहुत बहुत धन्यवाद! मैंने यह प्रश्न पोस्ट किया क्योंकि मैं यह जांचना चाहता था कि मैंने [इस धागे] में क्या कहा है (http://stackoverflow.com/questions/9162256/cartesian-product-traverse-in-scalaz/9162706#9162706) (उत्तर में दोनों और टिप्पणियों में) सही था। – missingfaktor