2013-01-09 13 views
6

मुझे हास्केल में एक स्ट्रिंग (अग्रणी/पिछला पात्रों को हटाने) के बारे में कुछ भी नहीं मिला है, और strip या chomp फ़ंक्शन खोजने के लिए कोई जगह नहीं है (मुझे सही करें मैं गलत हूँ)।स्ट्रिप बाएं/दाएं स्ट्रिंग (और चॉम्प)

मैं क्या करूँगा?

+0

http://hackage.haskell.org/packages/archive/MissingH/1.0.0/doc/html/Data-String-Utils.html – Shmiddty

उत्तर

8

Data.Text पर एक नज़र डालें। कुछ भी जो प्रीलूड सूचियों का उपयोग करता है, जैसे कि String एस, आमतौर पर खराब प्रदर्शन करता है, खासकर stripR जैसे कार्यों के साथ। कुछ लोग अतीत से गलती मानते हैं, क्योंकि इसने पाठ के डेटा के लिए पात्रों (String) की एकल लिंक्ड सूचियों का उपयोग करने की अक्षमता के साथ बहुत से (अन्यथा समझदार) इंटरफेस को संक्रमित किया है।

कार्यों आप देख रहे हैं क्रम में, कर रहे हैं: dropWhile, dropWhileEnd, dropAround, stripStart, stripEnd, strip

नोट चरित्र समानता पर आधारित अलग करना के लिए कोई विशेष समारोह उपलब्ध न हो। आप वास्तव में विधेय के साथ अलियासिंग dropX से कुछ भी हासिल नहीं करते हैं जब तक कि यह एक बहुत सामान्यतः Data.Char.isSpace की तरह एक का उपयोग किया है।

1

यहाँ 3 कार्य हैं और 3 के माध्यम से यह सुनिश्चित करने के लिए एलियास कार्यों currified:

stripL :: Char -> String -> String 
stripL x = dropWhile (==x) 

stripR :: Char -> String -> String 
stripR x = reverse . stripL . reverse 

strip :: Char -> String -> String 
strip x = stripL x . stripR x 

chompL :: String -> String 
chompL = stripL ' ' 

chompR :: String -> String 
chompR = stripR ' ' 

chomp :: String -> String 
chomp = strip ' ' 

आप क्या सोचते हैं? क्या Data.String पर ऐसे फ़ंक्शन जोड़ना संभव है?

+3

'स्ट्रिपआर x = रिवर्स। स्ट्रिपएल – Shmiddty

+0

अच्छा परिभाषाओं reverse', तथापि, मैं तर्क है कि यदि आप स्ट्रिंग का उपयोग कर रहे हैं, तो आप, रैखिक अपने इनपुट पर कार्रवाई करने के लिए प्रयास करना चाहिए, और केवल कभी मोर्चे पर खाली स्थान के पट्टी, dropWhile isSpace का उपयोग करके टैब आदि को कवर करने के पीछे अलग करना क्योंकि सूची में अक्षम है। (यदि आप स्ट्रिप करते हैं और आपको मिलते हैं [], तो आप अपने इनपुट के अंत में हैं।) इसलिए मैं केवल स्ट्रिपल का उपयोग करता हूं और बूंद ढूंढता हूं जबकि अधिक आसानी से लचीला होता है। यही कारण है कि वे छोड़े गए थे। – AndrewC

5

सबसे पहले, आपको (text पैकेज से) String के बजाय text अधिक कुशलता से उपयोग करना चाहिए।

-- Remove leading and trailing white space from a string. 
strip :: Text -> Text 
3

अधिक सामान्य दृष्टिकोण, strip कार्यों के लिए एक विधेय पारित करने के लिए किया जाएगा तो एक सकता है stripL isSpace उदहारण के लिए:

इसके अलावा, text पहले से ही इस कार्य है सभी प्रमुख सफेद जगह को हटाने के लिए।

फिर stripL लेकिन सिर्फ dropWhile के लिए एक उपनाम होगा।

अंत को अनावृत करना के लिए, एक संभावित अधिक कुशल संस्करण foldr का उपयोग करता है,

stripR :: (a -> Bool) -> [a] -> [a] 
stripR pred = foldr keepOrDrop [] 
    where 
    keepOrDrop c xs 
     | pred c = case xs of 
         [] -> [] 
         _ -> c:xs 
     | otherwise = c:xs 

कि पूरे इनपुट सूची traversing के बिना उत्पादन का निर्माण शुरू कर सकते हैं और कुशल है अगर वहाँ संतोषजनक तत्वों का कोई लंबा रन हैं इसे इनपुट की भविष्यवाणी करें।

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