2013-11-27 13 views
5

पोस्ट शीर्षक कहते हैं, मैं हास्केल में निम्नलिखित समारोह को परिभाषित कर रहा हूँ की सूची से मिलान पैटर्न:हास्केल tuples

prop_LeftInverse :: (Eq a, Eq b) => [(a,b)] -> Bool 
prop_LeftInverse (x,y):(xs,ys) = undefined 

जो इनपुट के रूप में tuples की एक सूची ले जाना चाहिए। मैं एक parse error in pattern हो रही है, लेकिन मैं यह समझ नहीं कर सकते कि यह क्या है, और यह भी इस विशेष मामले के बारे में कोई जानकारी नहीं मिली है ...

उत्तर

9

लगभग सही:

prop_leftInverse ((x, y):rest) = undefined 

सबसे पहले , आपको पूरे पैटर्न के चारों ओर कोष्ठक की आवश्यकता है। दूसरा, सूची में पहला तत्व एक ट्यूपल है, लेकिन शेष सूची सिर्फ टुपल्स की एक सूची है, सूचियों की एक झुकाव नहीं।

आप एक सामान्य सूची

head :: [a] -> a 
head [] = error "Empty list" 
head (x:xs) = x 

पर सरल पैटर्न मिलान को देखें, तो इस प्रकार का a के सभी मानों, या सभी प्रकार के काम करता है। आप एक विशिष्ट प्रकार चाहते हैं, इस तरह के Int के रूप में, आप

headIsOne :: [Int] -> Bool 
headIsOne (1:xs) = True 
headIsOne _ = False -- Here the _ matches anything 

तो कर सकता है, तो आप एक टपल मिलान करना चाहते हैं:

addTup :: (Int, Int) -> Int 
addTup (x, y) = x + y 

हम देखते हैं कि पैटर्न एक टपल मैच के लिए वास्तव में कितनी है हम कोड में एक लिखते हैं, इसलिए सूची की शुरुआत में एक से मिलान करने के लिए, हमें केवल एक विशिष्ट पैटर्न के साथ पहले तत्व से मिलान करना होगा।

prop_leftInverse ((x, y):rest) = undefined 

सूची के बाकी rest को सौंप दिया जाता है (हालांकि आप इसे कॉल कर सकते हैं जो कुछ भी आप चाहते हैं)।


एक और उदाहरण

आप पहले दो tuples हड़पने के लिए चाहता था, तो:

myFunc ((x, y):(v, u):rest) = undefined 

या पहले तीन:

myFunc ((x1, y1):(x2, y2):(x3, y3):rest) = undefined 

अब तक मुझे आशा है कि आप कर सकते हैं पैटर्न देखें (इसे प्राप्त करें?)

+0

यह बहुत विस्तृत था, धन्यवाद! –