2015-11-21 8 views
5

मैं एल्म 0.15 से 0.16 तक लाइब्रेरी माइग्रेट करने का प्रयास कर रहा हूं। रिकॉर्ड एक्सटेंशन तंत्र हटा दिया गया है।एल्म रिकॉर्ड एक्सटेंशन के लिए वैकल्पिक

My library शरीर पर भौतिकी गणना (रिकॉर्ड के रूप में प्रतिनिधित्व) प्रदान करता है, और रिकॉर्ड एक्सटेंशन का उपयोग करता है ताकि उपयोगकर्ता शरीर के बारे में लेबल और अन्य मेटाडेटा जोड़ सकें।

मेरे example code शो उनके निर्माण के बाद सभी निकायों के लिए लेबल जोड़कर इस प्रयोग:

main = Signal.map scene (run labeledBodies tick) 

किस तरह की:

labeledBodies = map (\b -> { b | label = bodyLabel b.restitution b.inverseMass }) someBodies 

लेबल शरीर भी पुस्तकालय के लिए पारित हो जाता है की यह सूची काम करता है:पैरामीटर को Body में हार्डकोडिंग इस तरह:

type alias Body a = { 
    pos: Vec2, -- reference position (center) 
    velocity: Vec2, -- direction and speed 
    inverseMass: Float, -- we usually use only inverse mass for calculations 
    restitution: Float, -- bounciness factor 
    shape: Shape, 
    meta: a 
} 

लेकिन यह एपीआई को अधिक बेकार बनाता है क्योंकि यह सहायक पैरामीटर को अतिरिक्त पैरामीटर लेने के लिए मजबूर करता है। क्या इस बदलाव से निपटने के लिए एक और शानदार तरीका है?

+0

क्या रिकॉर्डिंग के लिए रिकॉर्ड पर वास्तव में आवश्यक लेबल है? क्या आप 'रन' फ़ंक्शन के अंदर से 'bodyLabel' को कॉल कर सकते हैं? –

+0

इस मामले में, हाँ (लेकिन यह हर बार यह अतिरिक्त काम करेगा), लेकिन सामान्य मामले में, नहीं: मैं अन्य मेटाडेटा को ट्रैक करने में सक्षम होना चाहता हूं जो शरीर पर निर्भर नहीं है (जैसे हिट पॉइंट्स, अद्वितीय आईडी, जो भी हो) –

उत्तर

1

क्या होगा यदि meta फ़ील्ड में Dict String String टाइप किया गया था? तो आपको किसी भी पागल प्रकार चरमता को नहीं करना पड़ेगा। हालांकि, आप गारंटी देते हैं कि आपके द्वारा पास किए गए सभी रिकॉर्ड में वास्तव में लेबल होते हैं, इसलिए Dict.get "label" r.meta पर आपको Maybe String के साथ काम करना होगा।

+0

मैंने एक निश्चित आईडी या मेटाडाटा के लिए एक फ़ील्ड जोड़ने पर विचार किया था, लेकिन यह सामान्य मामले के लिए इतना अच्छी तरह से काम नहीं करेगा, जहां मैं केवल स्ट्रिंग मानों को ट्रैक नहीं करना चाहता हूं। –

1

टैग किए गए यूनियन प्रकार का उपयोग करने के बारे में क्या?

type BodyWithMeta = 
    LabeledBody Body String 

labeledBodies = map (\b -> LabeledBody b (bodyLabel b.restitution b.inverseMass)) someBodies 
+0

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

+0

'रन' को लेबल की आवश्यकता है? – robertjlooby

+0

'run' की आवश्यकता नहीं है (इसे इसके बारे में कुछ भी नहीं पता है), लेकिन इसे डेटा संरचना का हिस्सा बनने की आवश्यकता है जो' रन ' –

संबंधित मुद्दे