पर "showable" दिखाएँ जो मैंहास्केल: सभी तत्वों को एक Hlist
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()]
की कोशिश की है, लेकिन यह
लौटे["()"]
पर "showable" दिखाएँ जो मैंहास्केल: सभी तत्वों को एक Hlist
map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()]
की कोशिश की है, लेकिन यह
लौटे["()"]
आपका कोड ऐसा नहीं करता है जो आप उम्मीद करते हैं। Data.Dynamic
के गतिशील व्यवहार से बहुत पहले, हास्केल प्रकार परीक्षक प्रकारों को हल करता है। अभिव्यक्ति के अधिकार के भाग के प्रकार
mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()] :: Typeable b => [b]
है और बाएं हिस्से के प्रकार
map show :: Show a => [a] -> [String]
इसलिए इन, प्रकार चर b
resp गठबंधन करने के लिए है। a
एकीकृत हो जाता है। यदि आप इसे नियमित हास्केल फ़ाइल से संकलित करना चाहते थे, तो संकलक आपको चेतावनी देगा (The type variable `a' is ambigous
)। लेकिन जीएचसीआई में, दुभाषिया सिर्फ ()
पर डिफ़ॉल्ट है।
लेकिन यह के Dynamic -> Maybe()
पर अभिव्यक्ति में ()
के सभी तत्वों को प्रभावी ढंग से चुनने के प्रकार को ठीक करता है।
यदि आप कंपाइलर को एक अलग प्रकार का उपयोग करने के लिए मजबूर करते हैं, उदा। एक प्रकार हस्ताक्षर निर्दिष्ट करके, आप देखते हैं कि fromDynamic
एक अलग प्रकार का चयन करता है:
Prelude Data.Dynamic Data.Maybe> map (show :: Integer -> String) . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()]
["3"]
दुर्भाग्य से, वहाँ प्राप्त करने के लिए आप क्या चाहते हैं कोई रास्ता नहीं है: सभी तत्वों जिसका प्रकार समर्थन एक शो उदाहरण का चयन करें, के रूप में है कि जानकारी उपलब्ध नहीं है fromDynamic
पर।
समस्या यह है कि fromDynamic
एक monomorphic प्रकार के पास जाना चाहिए। यह ()
चुन रहा है, लेकिन एक प्रकार के हस्ताक्षर के साथ आप इसे किसी अन्य प्रकार का चयन कर सकते हैं।
इसे दिखाने के लिए, आपको कुछ फ़ंक्शन की आवश्यकता होगी जो बदले में सभी संभावित प्रकारों का प्रयास करें। शायद आप इस तरह के डेटा को स्टोर नहीं करना चाहते हैं, लेकिन इसे कुछ संचालन (जैसे शो) के साथ बंडल करना चाहते हैं।
दो तरीके हैं जिन्हें आप बंडल कर सकते हैं। मेरा पसंदीदा है कि सभी कार्यों को मूल्य पर पूर्व-लागू किया जाए (इसलिए शो के लिए, आपको String
प्रकार के थंक्स की एक सूची प्राप्त करें)।
दूसरा तरीका यह है कि कार्यों को Dynamic
में रखें (सुनिश्चित करें कि वे सही मोनोमोर्फिक प्रकार हैं!) और फिर dynApply
का उपयोग करें।
अच्छा विचार: "इसे कुछ परिचालनों के साथ बंडल करें" – rbarreiro
क्या आपको _really_ को उस सूची में मिश्रित डेटा को स्टोर करने की आवश्यकता है? – AndrewC
आप उस डेटा को अधिक आसानी से स्टोर करने के लिए रिकॉर्ड का उपयोग कर सकते हैं, उदाहरण के लिए, और आप आसानी से तत्वों पर शो जैसे कार्यों का उपयोग करने में सक्षम होंगे क्योंकि प्रकार रनटाइम पर उपलब्ध हैं। रनटाइम पर तय किए गए प्रकार एक लाभ है, नुकसान नहीं, इसलिए जब भी संभव हो तो आपको इसे करना चाहिए। – AndrewC
यह समस्या मेरी समस्या को स्पष्ट करने के लिए बनाई गई थी। जिस परियोजना में मैं काम कर रहा हूं वह यहां है github.com/rbarreiro/farofias प्रोजेक्ट में अगला चरण फ़ंक्शन जोड़ना है, जो डेटा.डाटा का उदाहरण नहीं है। – rbarreiro