2013-02-04 11 views
5

पर "showable" दिखाएँ जो मैंहास्केल: सभी तत्वों को एक Hlist

map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn()] 

की कोशिश की है, लेकिन यह

लौटे
["()"] 
+1

क्या आपको _really_ को उस सूची में मिश्रित डेटा को स्टोर करने की आवश्यकता है? – AndrewC

+0

आप उस डेटा को अधिक आसानी से स्टोर करने के लिए रिकॉर्ड का उपयोग कर सकते हैं, उदाहरण के लिए, और आप आसानी से तत्वों पर शो जैसे कार्यों का उपयोग करने में सक्षम होंगे क्योंकि प्रकार रनटाइम पर उपलब्ध हैं। रनटाइम पर तय किए गए प्रकार एक लाभ है, नुकसान नहीं, इसलिए जब भी संभव हो तो आपको इसे करना चाहिए। – AndrewC

+0

यह समस्या मेरी समस्या को स्पष्ट करने के लिए बनाई गई थी। जिस परियोजना में मैं काम कर रहा हूं वह यहां है github.com/rbarreiro/farofias प्रोजेक्ट में अगला चरण फ़ंक्शन जोड़ना है, जो डेटा.डाटा का उदाहरण नहीं है। – rbarreiro

उत्तर

5

आपका कोड ऐसा नहीं करता है जो आप उम्मीद करते हैं। 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 पर।

7

समस्या यह है कि fromDynamic एक monomorphic प्रकार के पास जाना चाहिए। यह () चुन रहा है, लेकिन एक प्रकार के हस्ताक्षर के साथ आप इसे किसी अन्य प्रकार का चयन कर सकते हैं।

इसे दिखाने के लिए, आपको कुछ फ़ंक्शन की आवश्यकता होगी जो बदले में सभी संभावित प्रकारों का प्रयास करें। शायद आप इस तरह के डेटा को स्टोर नहीं करना चाहते हैं, लेकिन इसे कुछ संचालन (जैसे शो) के साथ बंडल करना चाहते हैं।

दो तरीके हैं जिन्हें आप बंडल कर सकते हैं। मेरा पसंदीदा है कि सभी कार्यों को मूल्य पर पूर्व-लागू किया जाए (इसलिए शो के लिए, आपको String प्रकार के थंक्स की एक सूची प्राप्त करें)।

दूसरा तरीका यह है कि कार्यों को Dynamic में रखें (सुनिश्चित करें कि वे सही मोनोमोर्फिक प्रकार हैं!) और फिर dynApply का उपयोग करें।

+1

अच्छा विचार: "इसे कुछ परिचालनों के साथ बंडल करें" – rbarreiro