2009-10-21 13 views
16

में पैटर्न मिलान स्ट्रिंग उपसर्गों का मान लें कि मैं एक ऐसे फ़ंक्शन के लिए एक विशेष मामला बनाना चाहता हूं जो चरित्र 'जेड' से शुरू होने वाले तारों से मेल खाता हो।Haskell

myfunc ('Z' : restOfString) = -- do something special 
myfunc s = -- do the default case here 

लेकिन क्या मैं एक लंबे समय तक उपसर्ग के साथ तार मिलान करना चाहते हैं: मैं आसानी से निम्नलिखित की तरह कुछ कर रही द्वारा पैटर्न मिलान का उपयोग कर इसे कर सकता है? मान लें कि मैं तारों के लिए एक विशेष मामला चाहता हूं जो "टोस्टर" शब्द से शुरू होता है। ऐसी स्ट्रिंग से मेल खाने के लिए पैटर्न लिखने का सबसे अच्छा तरीका क्या है?

+0

ऑफहैंड वांछित प्रभाव प्राप्त करने के लिए टेम्पलेट हास्केल लिखने और आमंत्रित करने के लिए बहुत सरल दिखता है। हालांकि, मैं निश्चित रूप से एक टी व्यक्ति के लिए पर्याप्त नहीं हूं। –

+0

दुर्भाग्यवश, जीएचसी पैटर्न स्प्लिसेस को लागू नहीं करता है (जहां तक ​​मुझे पता है, स्पष्ट रूप से यह वास्तव में कठिन है), इसलिए यह संभव नहीं है। – ephemient

उत्तर

29
myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ... 

सामान्य पैटर्न मिलान कार्यों का उपयोग करके, लेकिन परेशान हो जाता है क्योंकि उपसर्ग स्ट्रिंग अधिक हो जाती है।

{-# LANGUAGE PatternGuards #-} 
import Data.List 
myFunc string | Just restOfString <- stripPrefix "toaster" string = 
    -- do something special 
myFunc string = -- do the default case here 

पैटर्न मिलान के बजाय लाइब्रेरी फ़ंक्शन का उपयोग करना पढ़ने और लिखना थोड़ा आसान है।

{-# LANGUAGE ViewPatterns #-} 
import Data.List 
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special 
myFunc string = -- do the default case here 

एक जीएचसी 6.10 वाक्यविन्यास विस्तार इस उपयोग को और भी प्राकृतिक बनाता है।


बेशक, बाद वाले दो पूरी तरह से समकक्ष हैं, और हम बिना किसी चीनी के (गंदे) कर सकते हैं।

import Data.List 
myFunc string = 
    if restIsJust 
     then -- do something special 
     else -- do the default case here 
    where 
    (restIsJust, restOfString) = 
     case stripPrefix "toaster" string of 
      Just something -> (True, something) 
      Nothing -> (False, undefined) 

उन वाक्यविन्यास एक्सटेंशन हमारे लिए जीवन को आसान बनाने के लिए हैं, हालांकि।

3
myfunc ('t' : 'o' : 'a' : 's' : 't' : 'e' : 'r' : restOfString) 

जहां तक ​​मुझे पता है, उससे कोई संक्षिप्त वाक्यविन्यास नहीं है।

आप निश्चित रूप से यह भी जांच सकते हैं कि स्ट्रिंग एक क्लॉज-क्लॉज में टॉस्टर से शुरू होती है या फ़ंक्शन बॉडी के अंदर if होती है।

8
import Data.List 

myFunc str | "toaster" `isPrefixOf` str = something restOfString 
      | otherwise = somethingElse 
    where Just restOfString = stripPrefix "toaster" str 
+2

मैं इस तरह कुछ पहले सोच रहा था, लेकिन यह मूर्खतापूर्ण लगता है कि "टोस्टर" को दो बार लिखना है। – ephemient

3
myFunc str = 
    case stripPrefix "toaster" str of 
    Just restOfString -> something restOfString 
    Nothing -> somethingElse 

यही कारण है कि स्ट्रिपफ्रिक्स एक प्रकार का प्रकार देता है।

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