2010-07-30 17 views
6

में नई लाइनों को स्ट्रिपिंग करना हास्केल में स्ट्रिंग से न्यूलाइन को पट्टी करने के लिए बेवकूफ तरीका (या कोई है) क्या है? या क्या मुझे पिछली न्यूलाइन/रिक्त स्थान ढूंढकर और फिर उन्हें हटाकर अपना खुद का निर्माण करना है?हास्केल

संपादित करें: मैं क्या पायथन के rstrip करता है के लिए देख रहा हूँ, लेकिन वैकल्पिक "वर्ण" की जरूरत नहीं है तर्क:

string.rstrip (रों [, वर्ण])

वापसी एक पिछली वर्णों के साथ स्ट्रिंग की प्रति हटा दी गई। यदि वर्ण छोड़ा गया है या कोई नहीं, व्हाइटस्पेस वर्ण हटा दिए गए हैं। यदि दिया गया और कोई नहीं, वर्ण एक स्ट्रिंग होना चाहिए; स्ट्रिंग में वर्ण स्ट्रिंग के अंत से छीन लिया जाएगा इस विधि को कॉल किया जाता है।

+2

जबकि अपने प्रश्न और पायथन के 'हास्केल में rstrip' समारोह को लागू करने, यह ज्यादातर मामलों में हास्केल में बहुत मुहावरेदार नहीं है का उपयोग कर के साथ सौदा दिया विभिन्न जवाब दोनों। आम तौर पर आप 'लाइन' और 'शब्द' का उपयोग करेंगे, जब तक अन्यथा कोई विशेष कारण न हो। – Yitz

उत्तर

9

यहाँ एक सरल कार्यान्वयन (Wikipedia से रूपांतरित) है।

(वैसे, Hayoo! सवाल इस तरह के लिए एक महान संसाधन है: rstrip के लिए एक खोज आप सीधे Data.String.Utils पर ले जाता है।)

+0

मैंने डेटा में कभी नहीं देखा। स्ट्रिंग। पहले उपयोग करता है। उपयोगी। और rstrip बिल्कुल वही दिखता है जो चाहता था। –

3

तुम क्या मतलब है पर निर्भर करता है:

 
Prelude> filter (/= '\n') "foo\n\nbar\n" 
"foobar" 

Prelude> words "foo\n\nbar\n" 
["foo","bar"] 

लेकिन इन अच्छी तरह से रिक्त स्थान के साथ सौदा नहीं है। तो शायद आप जो खोज रहे हैं वह नहीं।

import Data.Char (isSpace) 
rstrip = reverse . dropWhile isSpace . reverse 

वहाँ भी एक rstrip पहले से ही Data.String.Utils में परिभाषित किया गया है:

+2

इनमें से कोई भी वास्तव में स्ट्रिंग को "स्ट्रिप्स" नहीं करता है, हालांकि ("अग्रणी या पीछे वाले वर्णों को हटाएं" की सामान्य समझ में)। –

1

वहाँ असली दुनिया हास्केल के अध्याय 4 में एक नमूना है जो बंटवारे करता है तुम्हें चाहिए। जब आप पूरा कर लेंगे तो आपको टुकड़ों को एकसाथ पेस्ट करना होगा। http://book.realworldhaskell.org/read/functional-programming.html

टेक्स्ट में "वार्मिंग अप: पोर्टेबल स्प्लिटिंग लाइनों" के लिए खोजें।

2

मैं इस दूसरे दिन का इस्तेमाल किया:

Prelude> let trimnl = reverse . dropWhile (=='\n') . reverse 
Prelude> trimnl "" 
"" 
Prelude> trimnl "\n" 
"" 
Prelude> trimnl "a\n" 
"a" 
Prelude> trimnl "a\n\n" 
"a" 
Prelude> trimnl "a\nb\n" 
"a\nb" 
+0

ट्रैविस के उत्तर के समान सिद्धांत है। – kennytm

+0

हां, मुझे लगता है कि हमने एक ही समय में टाइप किया था।लेकिन मेरा पोस्टर ने क्या पूछा है! मुझे वोट दीजिए! :) –

+0

मुझे लगता है कि trimnl = रिवर्स। बूंद ('elem'" \ n \ r \ t ")। रिवर्स पाइथन –

3

यदि यह एक विशिष्ट फ़ाइल पढ़ने आवेदन के लिए है, तो आप शायद lines साथ शुरू करना चाहिए। यह आपको Data.String.Utils.rstrip पूरी तरह से बचने के लिए अनुमति दे सकता है:

> lines "one time\na moose\nbit my sister\n" 
["one time", "a moose", "bit my sister"] 

आप देख सकते हैं, lines पूरी फ़ाइल का पाठ लेता है और ठीक से नहीं पीछे न्यू लाइन के साथ एक स्ट्रिंग में प्रत्येक पंक्ति बदल जाता है। इसका मतलब है आप तो जैसे किसी प्रोग्राम लिख सकते हैं:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt" 
    where process :: String -> String 
     process = -- your code here --