2013-03-10 5 views
5

मेरे प्रश्न यह है कि यदि मैं Hello, today is a Nice Day!! जैसे स्ट्रिंग में डालता हूं तो मैं रिक्त स्थान और विराम चिह्न से कैसे छुटकारा पा सकता हूं और अपरकेस अक्षरों को लोअरकेस के साथ बदल सकता हूं?हास्केल सूची समझ में कुछ प्रतिस्थापन करें

मुझे पता है कि उन्हें कैसे हटाया जाए लेकिन उन्हें कैसे बदला जाए।

विराम चिह्न से छुटकारा पाने के लिए भी।

क्षमा करें मुझे नहीं पता कि तारों के साथ गड़बड़ कैसे करें, केवल संख्याएं।

testList xs = [if x = [,|.|?|!] then " " | x<-xs] 

उत्तर

7
import Data.Char 

आप अंतरिक्ष के लिए विराम चिह्न और अपर केस से पात्रों को लोअर केस में परिवर्तित करना चाहते हैं

यदि आप विराम चिह्न को हटाना चाहते हैं और वर्णों को ऊपरी मामले से कम मामले में परिवर्तित करना चाहते हैं:

testList2 xs = [toLower x | x<-xs, not (x `elem` ",.?!")] 

उदाहरण:

toLower' :: Char -> Char 
toLower' char 
    | isNotUppercase = char -- no change required 
    | otherwise = toEnum (codeChar + diffLowerUpperChar) -- char lowered 
    where 
     codeChar = fromEnum char -- each character has a numeric code 
     code_A = 65 
     code_Z = 90 
     code_a = 97 
     isNotUppercase = codeChar < code_A || codeChar > code_Z 
     diffLowerUpperChar = code_a - code_A 
+0

यह मेरे उत्तर में एक टिप्पणी होनी चाहिए थी। क्या आप इसे पहले ही देख चुके थे? –

+0

यह बहुत मदद करता है। धन्यवाद। पावर प्वाइंट जिसने प्रोफेसर ने हमें केवल संख्याओं के साथ उदाहरण दिए थे, लेकिन यह पत्रों में हेरफेर करने के लिए मेरे कई प्रश्नों को साफ़ करता है। –

+0

लेकिन मैं कम करने के लिए कैसे लागू करूं? यह मुझे दायरे में नहीं देता है और मैंने आयात डेटा.चर जोड़ने की कोशिश की, लेकिन यह मुझे एक त्रुटि भी देता है। संपादित करें: मुझे यह एनवीएम काम करने के लिए मिला है। –

2

विराम चिह्न से छुटकारा पाने के लिए आप इस एक

[x | x<-[1..10], x `mod` 2 == 0] 

की तरह एक फिल्टर का उपयोग कर सकते हैं "अगर" आप उपयोग कर रहे फ़िल्टर नहीं कर पाएंगे। एक सूची समझ के "मानचित्र" भाग में एक अगर डालने से केवल दो विकल्पों के बीच चयन करना होगा, लेकिन आप उन्हें वहां फ़िल्टर नहीं कर सकते हैं।

चीजों को लोअरकेस में परिवर्तित करने के लिए के रूप में, आप के रूप में अपनी ही चाल पहले से ही संख्या में हटा सकते हैं:

[x*2 | x <- [1..10]] 
+1

तो यह की तरह [x कुछ होगा | x: testList2 "Te..S,!t LiS?T" == "test list"

आप नहीं चाहते या Data.Char आयात नहीं कर सकते हैं, तो यह toLower के एक कार्यान्वयन है <-xs, x 'mod' 2 == 0]? –

+0

@ बॉबबिंगटन नहीं, आप 'mod x 2' या 'x' 'mod'' 2' का उपयोग नहीं करते हैं जो पढ़ने में आसान है। यह लगभग 1 + 2' या '(+) 1 2' – kyticka

+0

जैसा ही है, मैं कोड में बैकटीक्स कैसे लिखूं? – kyticka

4

मैं एक लंबे समय के लिए हास्केल में एक कोड लिखने के बिना किया गया है, लेकिन अगले चाहिए अमान्य वर्ण छोटे अक्षरों पर अपरकेस से पात्रों को दूर (उनमें एक रिक्ति से प्रतिस्थापित करें) और यह भी परिवर्तित:

import Data.Char 

replace invalid xs = [if elem x invalid then ' ' else toLower x | x <- xs] 

ही ऐसा करने का एक और तरीका है:

repl invalid [] = [] 
repl invalid (x:xs) | elem x invalid = ' ' : repl invalid xs 
        | otherwise  = toLower x : repl invalid xs 

आप इस तरह replace (या repl) फ़ंक्शन को कॉल कर सकते हैं:

replace ",.?!" "Hello, today is a Nice Day!!" 

ऊपर कोड प्राप्त होगा:

"hello today is a nice day " 

संपादित करें: मैं Data.Char से toLower समारोह का उपयोग कर रहा हास्केल में, लेकिन यदि आप इसे स्वयं लिखना चाहते हैं, तो स्टैक ओवरफ़्लो पर यहां देखें। उस सवाल से पहले पूछा गया है।

0

यहाँ मॉड्यूल आयात करने, fromEnum और toEnum का उपयोग कर जो वर्णों की अनुमति के लिए चयन करने के लिए बिना एक संस्करण है:

testList xs = 
    filter (\x -> elem (fromEnum x) ([97..122] ++ [32] ++ [48..57])) $ map toLower' xs 
    where toLower' x = if elem (fromEnum x) [65..90] 
          then toEnum (fromEnum x + 32)::Char 
          else x 

OUTPUT: 
*Main> testList "Hello, today is a Nice Day!!" 
"hello today is a nice day" 

एक मॉड्यूल-कम की जगह समारोह के लिए, कुछ इस तरह काम कर सकते हैं:

myReplace toReplace xs = map myReplace' xs where 
    myReplace' x 
    | elem (fromEnum x) [65..90] = toEnum (fromEnum x + 32)::Char 
    | elem x toReplace   = ' ' 
    | otherwise     = x 

OUTPUT: 
*Main> myReplace "!," "Hello, today is a Nice Day!! 123" 
"hello today is a nice day 123" 
+0

याद रखें कि ओपी कुछ स्थानों को किसी स्थान से भी बदलना चाहता है। –

4

आप Data.Char में कार्यों की जरूरत मिलेगा:

import Data.Char 

process str = [toLower c | c <- str , isAlpha c] 

हालांकि व्यक्तिगत रूप से, मुझे लगता है कि समारोह compositional दृष्टिकोण स्पष्ट है:

testList xs = [if x `elem` ",.?!" then ' ' else toLower x | x<-xs] 

उदाहरण:: testList "TeST,LiST!" == "test list "

process = map toLower . filter isAlpha 
+1

यह समस्या का समाधान नहीं करता है - ओपी अमान्य वर्णों को स्थान से बदलना चाहता है, उन्हें हटाएं नहीं। @ ऑस्करमेडरोस का जवाब देखें। – luqui

+1

"मैं रिक्त स्थान और विराम चिह्न से कैसे छुटकारा पा सकता हूं और अपरकेस अक्षरों को लोअरकेस के साथ बदल सकता हूं?" यह मुझे लगता है जैसे ओपी रिक्त स्थान हटाना चाहता है। –

+2

शायद ओपी स्पष्टता के लिए सवाल संपादित कर सकता है अगर उसका मतलब कुछ और है। –

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