रियल वर्ल्ड हास्केल, अध्याय 4, प्रिंट के पेज 98 में पूछा गया है कि words
क्या सिलवटों का उपयोग करके इसे लागू किया जा सकता है, और यह मेरा सवाल भी है:
क्या यह संभव है? यदि नहीं, तो क्यों? अगर है, तो कैसे?
मैं निम्नलिखित के साथ आया था, जो इस विचार पर आधारित है कि प्रत्येक गैर-स्थान को आउटपुट सूची में अंतिम शब्द (यह otherwise
गार्ड में होता है ) के लिए पूर्व निर्धारित किया जाना चाहिए, और यह कि एक खाली जगह के लिए एक खाली शब्द के ट्रिगर को ट्रिगर करना चाहिए आउटपुट लिस्ट यदि कोई पहले से नहीं है (इसे if
- then
- में संभाला जाता है else
)।
myWords :: String -> [String]
myWords = foldr step [[]]
where
step x yss@(y:ys)
| x == ' ' = if y == "" then yss else "":yss
| otherwise = (x:y):ys
स्पष्ट रूप से यह समाधान गलत है, क्योंकि स्ट्रिंग के आउटपुट सूची में इनपुट स्ट्रिंग परिणाम में अग्रणी रिक्त स्ट्रिंग में अग्रणी स्थान है।
ऊपर दिए गए लिंक पर, मैंने अन्य पाठकों के लिए प्रस्तावित समाधानों में से कई में देखा है, और उनमें से कई मेरे समाधान के समान काम करते हैं, लेकिन वे आम तौर पर फोल्ड के आउटपुट को "पोस्ट-प्रोसेस" करते हैं, उदाहरण के लिए tail
अगर यह है तो एक खाली अग्रणी स्ट्रिंग है।
अन्य दृष्टिकोण टुपल्स (वास्तव में सिर्फ जोड़े) का उपयोग करते हैं, ताकि गुना जोड़ी से निपटता है और अग्रणी / अनुगामी स्थानों को अच्छी तरह से संभाल सकता है।
इन सभी तरीकों में, foldr
(या एक अन्य तह, fwiw) वह कार्य नहीं है जो बॉक्स से अंतिम आउटपुट प्रदान करता है; हमेशा कुछ और होता है जिसमें आउटपुट को किसी तरह समायोजित करना होता है।
इसलिए मैं प्रारंभिक प्रश्न पर वापस जाता हूं और पूछता हूं कि क्या यह वास्तव में लागू करना संभव है words
(इस तरह से कि यह तह का उपयोग करके अनुगामी / अग्रणी / दोहराया रिक्त स्थान को सही ढंग से संभालता है)। तक परतों का उपयोग करते हुए मेरा मतलब है कि तह समारोह सबसे बाहरी समारोह हो गया है:
myWords :: String -> [String]
myWords input = foldr step seed input