मुझे हास्केल में एक स्ट्रिंग (अग्रणी/पिछला पात्रों को हटाने) के बारे में कुछ भी नहीं मिला है, और strip
या chomp
फ़ंक्शन खोजने के लिए कोई जगह नहीं है (मुझे सही करें मैं गलत हूँ)।स्ट्रिप बाएं/दाएं स्ट्रिंग (और चॉम्प)
मैं क्या करूँगा?
मुझे हास्केल में एक स्ट्रिंग (अग्रणी/पिछला पात्रों को हटाने) के बारे में कुछ भी नहीं मिला है, और strip
या chomp
फ़ंक्शन खोजने के लिए कोई जगह नहीं है (मुझे सही करें मैं गलत हूँ)।स्ट्रिप बाएं/दाएं स्ट्रिंग (और चॉम्प)
मैं क्या करूँगा?
Data.Text
पर एक नज़र डालें। कुछ भी जो प्रीलूड सूचियों का उपयोग करता है, जैसे कि String
एस, आमतौर पर खराब प्रदर्शन करता है, खासकर stripR
जैसे कार्यों के साथ। कुछ लोग अतीत से गलती मानते हैं, क्योंकि इसने पाठ के डेटा के लिए पात्रों (String
) की एकल लिंक्ड सूचियों का उपयोग करने की अक्षमता के साथ बहुत से (अन्यथा समझदार) इंटरफेस को संक्रमित किया है।
कार्यों आप देख रहे हैं क्रम में, कर रहे हैं: dropWhile
, dropWhileEnd
, dropAround
, stripStart
, stripEnd
, strip
।
नोट चरित्र समानता पर आधारित अलग करना के लिए कोई विशेष समारोह उपलब्ध न हो। आप वास्तव में विधेय के साथ अलियासिंग dropX
से कुछ भी हासिल नहीं करते हैं जब तक कि यह एक बहुत सामान्यतः Data.Char.isSpace
की तरह एक का उपयोग किया है।
यहाँ 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
पर ऐसे फ़ंक्शन जोड़ना संभव है?
'स्ट्रिपआर x = रिवर्स। स्ट्रिपएल – Shmiddty
अच्छा परिभाषाओं reverse', तथापि, मैं तर्क है कि यदि आप स्ट्रिंग का उपयोग कर रहे हैं, तो आप, रैखिक अपने इनपुट पर कार्रवाई करने के लिए प्रयास करना चाहिए, और केवल कभी मोर्चे पर खाली स्थान के पट्टी, dropWhile isSpace का उपयोग करके टैब आदि को कवर करने के पीछे अलग करना क्योंकि सूची में अक्षम है। (यदि आप स्ट्रिप करते हैं और आपको मिलते हैं [], तो आप अपने इनपुट के अंत में हैं।) इसलिए मैं केवल स्ट्रिपल का उपयोग करता हूं और बूंद ढूंढता हूं जबकि अधिक आसानी से लचीला होता है। यही कारण है कि वे छोड़े गए थे। – AndrewC
सबसे पहले, आपको (text
पैकेज से) String
के बजाय text
अधिक कुशलता से उपयोग करना चाहिए।
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
अधिक सामान्य दृष्टिकोण, 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 के बिना उत्पादन का निर्माण शुरू कर सकते हैं और कुशल है अगर वहाँ संतोषजनक तत्वों का कोई लंबा रन हैं इसे इनपुट की भविष्यवाणी करें।
http://hackage.haskell.org/packages/archive/MissingH/1.0.0/doc/html/Data-String-Utils.html – Shmiddty