आप एक विषम सूची है, जो सबसे Haskellers विशेष रूप से नहीं है, भले ही वे खुद को इस एक ही सवाल जब पहली हास्केल सीखने को कहा है की तरह देख रहे हैं।
आप लिखें:
shapes :: (Shape t) => [t]
यह कहते सूची टाइप t
, जिनमें से सभी समान हैं और एक आकार होने के लिए होता है (एक ही आकार!)। दूसरे शब्दों में - नहीं, यह काम नहीं करना चाहिए कि आपके पास यह कैसे है।
दो आम तरीके इसे संभाल करने के लिए (पहले एक हास्केल 98 तरीका है, तो एक सजावटी तरह से है कि मैं दूसरी अनुशंसा नहीं करते) हैं:
एक नए प्रकार को स्थिर संघ ब्याज के उपप्रकार का उपयोग करें:
data Foo = F deriving Show
data Bar = B deriving Show
data Contain = CFoo Foo | CBar Bar deriving Show
stuffExplicit :: [Contain]
stuffExplicit = [CFoo F, CBar B]
main = print stuffExplicit
यह अच्छा दिख रहा है क्योंकि यह सीधे आगे है और आप सूची में मौजूद चीज़ों के बारे में कोई जानकारी नहीं खोते हैं। आप निर्धारित कर सकते हैं कि पहला तत्व Foo
है और दूसरा तत्व Bar
है। जैसा कि आप शायद पहले ही महसूस कर चुके हैं, यह है कि आपको एक नया Contain
प्रकार कन्स्ट्रक्टर बनाकर प्रत्येक घटक प्रकार को स्पष्ट रूप से जोड़ना होगा। अगर यह अवांछनीय है तो पढ़ना जारी रखें।
मौजूदा प्रकारों का उपयोग करें: एक अन्य समाधान में तत्वों के बारे में जानकारी खोना शामिल है - आप केवल एक ही कक्षा में हैं, यह समझते हुए कहते हैं कि तत्व एक वर्ग में हैं। नतीजतन आप सूची तत्वों पर उस वर्ग से केवल संचालन का उपयोग कर सकते हैं। उदाहरण के लिए, नीचे ही याद होगा तत्वों Show
वर्ग के हैं, इसलिए केवल एक चीज आप तत्वों के लिए क्या कर सकते हैं उपयोग कार्यों कि Show
में बहुरूपी हैं:
data AnyShow = forall s. Show s => AS s
showIt (AS s) = show s
stuffAnyShow :: [AnyShow]
stuffAnyShow = [AS F, AS B]
main = print (map showIt stuffAnyShow)
यह हास्केल भाषा के लिए कुछ एक्सटेंशन की आवश्यकता है , अर्थात् ExplicitForAll
और ExistentialQuantification
। हमें showIt
स्पष्ट रूप से परिभाषित करना था (AnyShow
प्रकार को डीकनस्ट्रक्चर करने के लिए पैटर्न मिलान का उपयोग करना) क्योंकि आप अस्तित्वत्मक मात्रा का उपयोग करने वाले डेटा प्रकारों के लिए फ़ील्ड नामों का उपयोग नहीं कर सकते हैं।
और अधिक समाधान हैं (उम्मीद है कि कोई अन्य जवाब Data.Dynamic
का उपयोग करेगा - यदि कोई भी नहीं करता है और आप रुचि रखते हैं तो उस पर पढ़ लें और जेनरेट करने वाले किसी भी प्रश्न पोस्ट करने के लिए स्वतंत्र महसूस करें)।
http://www.haskell.org/haskellwiki/Heterogenous_collections –
मुझे विषम संग्रहों से अवगत था, लेकिन यह ऐसा कुछ है जिसे मैं टालना चाहता था। – Arlen