2015-08-06 4 views
5

क्या Data.Set सेट के लिए सूची समझ वाक्यविन्यास के वाक्यविन्यास का उपयोग करने के लिए कोई भाषा विस्तार जैसे कोई भाषा विस्तार है?हास्केल सेट समझ

उदाहरण:

f :: Set a -> Set b -> Set (a,b) 
f xs ys = [(x,y) | x <- xs , y <- ys] -- this is the set comprehension 

सेट के बाद से गणितीय संरचना है कि सूची comprehensions यह एक तरह की अजीब होगा प्रेरित सेट पर उनका इस्तेमाल की किसी भी संभावना है करने के लिए नहीं हैं।

और हाँ, मैं किसी भी Monad/MonadPlus प्रकार के साथ लेकिन सेट AFAIK सूची कंप्यूटर अनुप्रयोग सिंटैक्स का उपयोग भी सबसे कार्यों में Ord बाधा की वजह से monads नहीं हो सकता है के लिए MonadComprehensions के बारे में पता कर रहा हूँ।

+1

'सेट गणितीय संरचना है जो सूची समझ को प्रेरित करती है' लेकिन डेटा.Set उस संरचना को 'ऑर्ड बाधा' के कारण नहीं है। –

उत्तर

6

सिद्धांत रूप में, कोई

कोई भाषा एक्सटेंशन जिसके लिए अनुमति देते हैं "comprehensions निर्धारित किया है।"

एक Set और एक List के बीच मतभेद हैं:

  1. Set अव्यवस्थित है, जबकि List
  2. Set के तत्वों का आदेश दिया है अद्वितीय हैं List डुप्लिकेट तत्वों को
  3. ले सकते हैं जब Set का प्रकार Ord का उदाहरण है जबकि List में कोई प्रकार प्रतिबंध नहीं है।

आप देख सकते हैं कि हर संभव Set सब संभव List एस के एक सख्त सबसेट हैं। इसका मतलब है कि हम "सेट समझ" प्राप्त कर सकते हैं, बस एक सूची समझ का उपयोग कर इसे Set में परिवर्तित कर सकते हैं। आलसी मूल्यांकन अक्सर "सेट पीढ़ी" को अधिकतर परिमित सूची समझ से प्राप्त करने में सक्षम बनाता है। हालांकि, अनंत सूचियों के परिणामस्वरूप समझने की संभावनाएं कुशल "सेट समझ" के परिणामस्वरूप होने की संभावना नहीं है।

उदाहरण:

import Data.Set 

set :: Ord a => Set a 
set = fromList [x * y | x <- [1..10], y <- [1..10]] 

अभ्यास में, हां

set-monad पैकेज का उपयोग करके आप एक SetMonad का एक उदाहरण के रूप में परिभाषित करने और भाषा विस्तार MonadComprehensions का उपयोग कर सकते हैं कि आप प्राप्त कर सकते हैं एक "सेट समझ "।

उदाहरण:

{-# LANGUAGE MonadComprehensions #-} 
import Data.Set.Monad 

set1 :: Set (Int,Int) 
set1 = do 
     a <- fromList [1 .. 4] 
     b <- fromList [1 .. 4] 
     return (a,b) 

-- Look a "set comprehension" 
set2 :: Set (Int,Int) 
set2 = [ (a,b) | (a,b) <- set1, even a, even b ] 

उपयोग जो भी विधि अपनी परियोजना के लिए सर्वाधिक महत्व रखता है। निर्णय लेने से पहले प्रोफ़ाइल दोनों!

+1

एर ... आलसी मूल्यांकन कैसे सेट पीढ़ी को कुशल बना देगा?सेट बनाने के लिए आपको सभी सूची का मूल्यांकन करना होगा। आलसी मूल्यांकन यहां कुछ भी नहीं लगता है। – Cubic

+1

@ क्यूबिक आप पूरी सूची नहीं तैयार करेंगे और फिर पूरे सेट को उत्पन्न करेंगे। ऑपरेशन आलसी मूल्यांकन के कारण फ्यूज होगा, इसलिए यदि मैं एक तत्व के डुप्लिकेट की एक बड़ी सूची उत्पन्न करता हूं, तो मुझे मेमोरी ओवरहेड नहीं लगेगा, क्योंकि सेट सूची से आलसी रूप से आकर्षित होगा और सिंगलटन सेट बनाएगा। –

+1

लिस्ट के कार्यान्वयन के आधार पर, दुनिया के सर्वश्रेष्ठ और बहुत किस्मत और आशावाद के साथ, यदि सूची बड़ी आलस्य है तो जीसी को सूची के प्रमुख को साफ़ करने का मौका दे सकता है जबकि पूंछ को खिलाया जा रहा है बिल्डर सेट करें। लेकिन वास्तविक दुनिया में मुझे संदेह है कि वास्तव में कोई प्रभाव होगा। –