7

मैं अपने स्वयं के इंफिक्स ऑपरेटर को हास्केल का उपयोग करके परिभाषित करना चाहता हूं जो दो तारों को एक साथ जोड़ता है। हालांकि, मैं एक अतिरिक्त खंड में फेंकना चाहता हूं जहां ऑपरेटर दोनों तारों में ओवरलैपिंग तत्वों पर सहमत होगा। तो एक उदाहरण होगाकंसैट दो तार एक साथ

"eagle" myinfix "eagleeyes" = "eagleeyes" 
"water" myinfix "book" = "waterbook" 
"need" myinfix "education" = "needucation" 

मैं पहले से ही पता लगा कि कैसे साथ तार में ओवरलैपिंग अंश वापस जाने के लिए:

check x y = head $ filter (`isPrefixOf` y) (tails x) 

लेकिन मैं कैसे में किसी भी मदद की है कि शामिल करने के लिए पता नहीं है।?

+2

तीसरा उदाहरण "आवश्यकता" क्यों नहीं है? –

+1

और पहला उदाहरण क्यों नहीं है "ईगलियस" '? 'चेक "ईगल" "eagleeyes" = "ईगल" '। – dave4420

+0

हाँ क्षमा करें दोस्तों मुझे एहसास हुआ कि मैंने उदाहरण आउटपुट में कुछ त्रुटियां की हैं। मैंने – Bobo

उत्तर

8

आप इसके बारे में गलत तरीके से जा रहे हैं।

(+++) :: Eq a => [a] -> [a] -> [a] 
xs  +++ ys | xs `isPrefixOf` ys = ys 
(x:xs) +++ ys      = x : (xs +++ ys) 

यही है कि आप वास्तव में ओवरलैप की परवाह नहीं करते हैं, आप बस परवाह करते हैं कि आप इसे प्राप्त कर चुके हैं या नहीं।


स्पष्ट रिकर्सन के बिना यहां एक और समाधान है।

(++++) :: Eq a => [a] -> [a] -> [a] 
xs ++++ ys = prefix ++ ys 
    where (prefix, _) : _ = filter (\(_, overlap) -> overlap `isPrefixOf` ys) $ zip (inits xs) (tails xs) 

यहाँ हम, ओवरलैप खोजने अपने check में के रूप में के बारे में जाना है, लेकिन ओवरलैप रखने के बजाय, हम xs वाले हिस्से की ओवरलैप नहीं करता उपज।

+0

को सही किया है Data.List.stripPrefix फ़ंक्शन का उपयोग करने वाला दूसरा: xs +++++ ys = xs ++ head [suffix | बस प्रत्यय <- नक्शा (फ्लिप स्ट्रिपफ्रिक्स वाईएस) (पूंछ xs)] –

1
overlapConcat :: (Eq a) => [a] -> [a] -> [a] 
overlapConcat s t = s ++ drop (length $ check s t) t 

यह जितनी जल्दी नहीं होगा के रूप में के बाद से यह रों पर दो गुजरता प्रदर्शन करेंगे, लेकिन मुझे लगता है कि इसे और अधिक पठनीय है, और सहज ज्ञान युक्त समझ में आता है प्रदान की अन्य संस्करणों।

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