2013-05-08 6 views
14

words प्रस्ताव पर विचार करें; यह वास्तव में आसान है और एक निम्नलिखित तरीके से यह लिख सकते हैं:प्रीलूड के शब्दों का कार्य अधिक सरल क्यों नहीं लिखा गया है?

words' :: String -> [String] 
words' [] = [] 
words' str = before : words' (dropWhile isSpace after) where 
    (before, after) = break isSpace str 

हालांकि, मैंने देखा है कि अपने मूल प्रस्तावना कोड बहुत कम ... प्राकृतिक लगता है:

words     :: String -> [String] 
words s     = case dropWhile {-partain:Char.-}isSpace s of 
           "" -> [] 
           s' -> w : words s'' 
             where (w, s'') = 
              break {-partain:Char.-}isSpace s' 

मुझे लगता है देखते हैं कि इसके लिए अनुकूलन से संबंधित कारण। सवाल यह है: क्या मुझे उम्मीद है कि संकलक को words' फ़ंक्शन को इसके साथ ही इसके प्रीलूड संस्करण को अनुकूलित करना चाहिए? मैंने एक ही फ़ंक्शन का उपयोग किया (break, dropWhile, isSpace)।

मैं एक बार बहुत आश्चर्य है कि GHC सरल निम्न स्तर के अनुकूलन के कुछ का पालन नहीं किया था:

C vs Haskell Collatz conjecture speed comparison

लेकिन एक तरफ {-partain:Char.-} बिट के लिए (संकलक के लिए इस संकेत में बहुत सहायक प्रतीत नहीं होता इस स्थिति आईएमओ) words कोड एक उच्च स्तरीय भाषा के लिए अनावश्यक रूप से फूला हुआ लगता है। इस मामले में इसके पीछे क्या कारण है?

+5

मुझे नहीं लगता कि '{-partain: Char .-}' बिट एक टिप्पणी-आउट मॉड्यूल नाम से कुछ भी है, वैसे भी। Google के अनुसार, अंतिम नाम वाले किसी व्यक्ति ने कुछ समय पहले जीएचसी पर काम किया था। मुझे लगता है कि वह सिर्फ उनकी टिप्पणियों पर हस्ताक्षर कर रहा था। – hammar

+0

ओह, मैंने सोचा कि यह संकलक पर कुछ प्रभाव हो सकता है। साथी आदमी के साथ अच्छा पकड़ो! – ljedrz

+2

वह भाग लेंगे। – augustss

उत्तर

12

यह लगभग एक ही कोड है। केवल अंतर यह है कि यदि हम प्रत्येक कॉल या केवल रिकर्सिव कॉल से पहले dropWhile isSpace कर रहे हैं। न तो दूसरे की तुलना में अधिक जटिल है, बल्कि बाद वाले (प्रीलूड) संस्करण अधिक वर्बोज़ लगता है क्योंकि पैटर्न मिलान सीधे फ़ंक्शन में नहीं है।

तुम इतनी तरह अंतर (और क्यों प्रस्तावना संस्करण बेहतर व्यवहार है) का पालन कर सकते हैं:

*Main> words " " 
[] 
*Main> words' "  " 
[""] 

ध्यान दें कि आप जल्दी से सत्यापित कर सकते हैं, तो अपने "सुधार" संस्करण QuickCheck का उपयोग कर मूल के समान हैं।

+0

ठीक है, मुझे नहीं लगता कि मेरा संस्करण किसी भी तरह से मूल से बेहतर है, लेकिन यह बात है; मेरे लिए ऐसा लगता था कि केवल अंतर ही शब्द था। – ljedrz

+0

मेरे पास 'प्रीलूड' और कुछ अन्य मूल पुस्तकालयों में एक और नज़र थी और मुझे यह कहना होगा कि शब्द परिभाषाओं में वास्तव में बहुत ही दुर्लभता है (और शायद आपके द्वारा वर्णित मामलों के बारे में समझाया गया है)। मूल प्रश्न शीर्षक एक अतिस्तरीय था :)। – ljedrz

संबंधित मुद्दे