क्या विभाजक के साथ सूची को छिपाने के लिए कोई हेकेल फ़ंक्शन है?


131

क्या किसी विभाजक के साथ सूची के तत्वों को समाप्‍त करने का कार्य है? उदाहरण के लिए:

> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]

किसी भी उत्तर के लिए धन्यवाद!


13
मुझे पता है कि lmgtfy उत्तर खराब हैं, लेकिन यह ध्यान देने योग्य है कि हुगले पर "स्ट्रिंग -> [स्ट्रिंग] -> स्ट्रिंग" के लिए एक खोज मिलती है जो आप चाहते हैं। haskell.org/hoogle
sigfpe

3
रिक्त स्थान के साथ जुड़ने के लिए आपके पासunwords
epsilonhalbe

1
@sigfpe साइड टिप्पणी: आपको इस [String] -> String -> Stringमामले में देखना होगा कि दूसरा तरीका कोई जवाब नहीं देता है, है ना?
गोंजालेज

1
@ LayGonzález खोज क्रमपरिवर्तन तक है। उदाहरण के लिए, इसके पहले परिणाम के रूप में [a] -> (a -> b) -> [b]रिटर्न की खोज map
गैलिस

जवाबों:


228

हाँ, वहाँ है :

Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"

intersperse थोड़ा और सामान्य है:

Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"

इसके अलावा, उस विशिष्ट मामले के लिए जहां आप एक अंतरिक्ष चरित्र के साथ जुड़ना चाहते हैं, वहाँ है unwords:

Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"

unlinesइसी तरह से काम करता है, केवल यह कि स्ट्रिंग्स को न्यूलाइन वर्ण का उपयोग करके फंसाया जाता है और अंत में एक न्यूलाइन वर्ण भी जोड़ा जाता है। (यह पाठ फ़ाइलों को क्रमबद्ध करने के लिए उपयोगी है, जो एक अनुगामी न्यूलाइन के साथ POSIX मानक के अनुसार होना चाहिए)


क्या इसमें से कोई भी संभावित खाली तारों से निपट सकता है?
CMCDragonkai

3
@CMCDragonkai निश्चित रूप से नहीं कि आप वास्तव में किसका उल्लेख कर रहे हैं, लेकिन हां, ये सभी कार्य विभाजक और तत्वों दोनों के रूप में मनमाने तार की अनुमति देते हैं। उदाहरण के लिए, intercalate "," ["some", "", "string"] = "some,,string"औरintercalate "" ["foo", "bar"] = "foobar"
निकल्स बी।

3
unlinesप्रत्येक पंक्ति में एक नई रेखा जोड़ता है, अर्थात् unlines ["A", "B"] = "A\nB\n", यह अंतःक्षेपण के समान नहीं है।
कैथी वान स्टोन

@ कैथीवनस्टोन दिलचस्प, मुझे लगता है कि मैंने कभी कोशिश नहीं की और केवल यह मान लिया कि यह अनुरूप काम करता है unwords
निकलैस बी।

1
यह अच्छा है कि मानक पुस्तकालय में कुछ सामान्य स्ट्रिंग और सूची हेरफेर फ़ंक्शन हैं, और यह अच्छा है कि आप यहां एक उदाहरण पोस्ट कर रहे हैं, क्योंकि हास्केल में इस तरह की रोजमर्रा की प्रोग्रामिंग के लिए किसी भी दस्तावेज को ढूंढना काफी कठिन है।
एंड्रयू कोस्टर जूल

4

फोल्डर का उपयोग करके एक-लाइनर लिखना मुश्किल नहीं है

join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]

3
यह एक विवरण जोड़ने के लिए फायदेमंद होगा; किसी ने इसे निम्न गुणवत्ता के रूप में चिह्नित किया।
आर्य मैकार्थी


3

अगर किसी को दिलचस्पी है, तो इंटरसेप्टर के कार्यान्वयन के कुछ अन्य विचार

myIntersperse :: a -> [a] -> [a]
myIntersperse _ [] = []
myIntersperse e xs = init $ xs >>= (:[e])

myIntercalate :: [a] -> [[a]] -> [a]
myIntercalate e xs = concat $ myIntersperse e xs

xs >>= fके बराबर है concat (map f xs)


2

यदि आप अपने स्वयं के संस्करण लिखना चाहते हैं intercalateऔर intersperse:

intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)

intersperse :: a -> [a] -> [a]
intersperse s [] = []
intersperse s [x] = [x]
intersperse s (x:xs) = x : s : (intersperse s xs)

1
अपने आप को स्ट्रिंग्स तक सीमित क्यों करें? इसके अलावा, फ़ंक्शन अनुप्रयोग के आसपास आपके पैरेंस बेमानी हैं।
melpomene

सच है, की intersperseजरूरत नहीं है Strings, लेकिन intercalateकम से कम करने की आवश्यकता होगी Show, और अगर आप का उपयोग किया थाShow , तो आप Stringवैसे भी एस का उपयोग कर उनके साथ सौदा करने के लिए किसी तरह की आवश्यकता होगी । मुझे अब भी आदत है कि हास्केल मिश्रित इन्फिक्स और प्रीफ़िक्स फ़ंक्शंस / ऑपरेटरों के साथ कैसे व्यवहार करता है, और मैं मिश्रण करते समय $
ब्रैकेटिंग

intercalate :: [a] -> [[a]] -> [a]- क्यों Show? वाक्य रचना का सवाल है, हास्केल (को छोड़कर किसी भी उपसर्ग ऑपरेटरों नहीं है -जो एक abomination है,), और समारोह आवेदन बांध किसी भी इन्फ़िक्स ऑपरेटर से तंग: x:s:intersperse s xsठीक है (लेकिन यह ज्यादा बेहतर पढ़ता है अगर आप में रिक्त स्थान डाल: x : s : intersperse s xs(मैं डॉन 'वास्तव में यह समझ में नहीं आता है कि लोग बाहर की जगहों को क्यों छोड़ना पसंद करते हैं :))।
melpomene

सही। मैं यह भूल जाता हूं कि स्ट्रिंग्स के साथ काम करना सिर्फ सूचियों के साथ काम करना है। Showऐसा इसलिए था क्योंकि मैं मान रहा था कि आप परिणाम चाहते हैं String। "इनफ़िक्स और प्रीफ़िक्स फ़ंक्शंस / ऑपरेटर्स" से मेरा मतलब "प्रीफ़िक्स फ़ंक्शंस और इनफ़िक्स ऑपरेटर्स" से था, लेकिन यह अस्पष्ट था। एकता -मृत्यु है। के रूप में :और अन्य इन्फ़िक्स ऑपरेटरों, कि क्या मैं रिक्तियों का उपयोग अत्यधिक संदर्भ पर निर्भर करता है, लेकिन मैं हमेशा स्थानीय रूप से संगत कर रहा हूँ। उदाहरण के लिए, (:)एक पैटर्न मैच में कभी रिक्त स्थान नहीं होता है, लेकिन कहीं और यह निर्भर करता है कि क्या यह ब्रैकेटेड है और मेरे मूड पर है।
Zoey Hewll
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.