2012-11-28 19 views
5

मुझे ऐसे संसाधनों को खोजने में परेशानी हो रही है जो एक अनबॉक्स किए गए वेक्टर में उपयोग के लिए मेरे डेटा प्रकारों को अनबॉक्स किए जाने के लिए काम करते हैं। मैं डेटा प्रकारमैं एडीटी का एक अनबॉक्स उदाहरण कैसे बना सकता हूं?

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq) 

अनबॉक्स का उदाहरण कैसे बनाऊंगा?

संपादित करें: थोड़ा और अधिक पोक करने के बाद, ऐसा लगता है कि कुछ कार्यों में पैरामीटर को मजबूती से मजबूर करने के द्वारा, मैं जीएचसी को स्वचालित रूप से अनबॉक्स करने के लिए मना कर सकता हूं। अगर यह मेरे मामले में लागू होता है? मुझे कैसे पता चलेगा कि कौन से paramaters सख्त बनाने के लिए?

+0

आप [इस उत्तर] को देखा है (http://stackoverflow.com/a/10866718)? – Fixnum

+0

हां, जीएचसीआई ने मुझे 'वेक्टर', 'एमवीक्टर', और 'यू। यूनबॉक्स' व्युत्पन्न कक्षाएं नहीं दी हैं। उल्लेख नहीं है कि मैं वास्तव में समझ नहीं पा रहा हूं कि वहां क्या हो रहा है, खासतौर पर 'सामान्यीकृत न्यूटाइपडिविंग' चीज़ के साथ, और मैं उन चीजों का उपयोग करने से पहले चीजों को समझना चाहता हूं। – Drew

+0

यह नहीं कि यह आपके प्रश्न का उत्तर देता है, लेकिन क्या आपने यहां बॉक्स किए गए वैक्टरों के साथ काम करने की कोशिश की है? वे परेशानी के बिना आपके डेटा प्रकार संभाल लेंगे। बेशक – jtobin

उत्तर

0

GeneralizedNewtypeDeriving आपकी मदद नहीं करेगा क्योंकि आप पहले से Unbox का एक उदाहरण है जो किसी नए प्रकार के लपेटने के बजाय 'पूर्ण-उड़ा' एडीटी से निपट रहे हैं।

आपका डेटा प्रकार बॉक्स किए गए वैक्टर के लिए अधिक उपयुक्त है। Data.Vector.Unboxed का उपयोग करें यदि आपको Double एस, Int एस आदि जैसे अधिक आदिम संख्यात्मक प्रकारों को पकड़ने की आवश्यकता है। शायद आप ColorUnbox का एक उदाहरण बना सकते हैं, लेकिन यह लगभग निश्चित रूप से the hassle के लायक नहीं है। आयात Data.Vector और आप तैयार हो जाएगा:

import qualified Data.Vector as V 

Color = Red | Blue deriving Show 

someColors :: V.Vector Color 
someColors = V.fromList [Red, Blue, Blue, Red] 
+0

जैसा कि मैंने पिछली टिप्पणी में उल्लेख किया था, मेरे नियमित बॉक्स किए गए वेक्टर से डेटा प्राप्त करना मेरे कार्यक्रम में 12% समय ले रहा था। मैं अनबॉक्सिंग पर स्विच करके उसमें से कुछ को खत्म करना चाहता हूं। – Drew

8

आप आप के लिए उदाहरण प्राप्त करने के लिए vector-th-unbox पैकेज का उपयोग कर सकते हैं। तुम बस करने के लिए और कुछ मौजूदा Unbox प्रकार से रूपांतरण कार्यों प्रदान करने की आवश्यकता:

colorToWord8 :: Color -> Word8 
colorToWord8 = ... 

word8ToColor :: Word8 -> Color 
word8ToColor = ... 

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    colorToWord8 
    word8ToColor 
संबंधित मुद्दे