परहेज मैं इन डेटा प्रकार है:हास्केल: "किस प्रकार के" कार्यों को प्राप्त करना चाहिए? और पूर्ण "पुनर्निर्माण"
data PointPlus = PointPlus
{ coords :: Point
, velocity :: Vector
} deriving (Eq)
data BodyGeo = BodyGeo
{ pointPlus :: PointPlus
, size :: Point
} deriving (Eq)
data Body = Body
{ geo :: BodyGeo
, pict :: Color
} deriving (Eq)
यह अक्षर, दुश्मन, वस्तुओं, आदि मेरी खेल में (अच्छी तरह से, मैं सिर्फ खिलाड़ी के रूप में दो आयतों है के लिए आधार डेटाप्रकार है और जमीन अभी अभी: पी)।
जब कोई कुंजी, वर्ण velocity
बदलकर दाएं, बाएं या कूदता है। को coords
पर जोड़कर स्थानांतरण किया जाता है।
move (PointPlus (x, y) (xi, yi)) = PointPlus (x + xi, y + yi) (xi, yi)
मैं बस अपना Body
और नहीं पूरे Body
की PointPlus
हिस्सा ले रहा हूँ, अन्यथा यह होगा::
move (Body (BodyGeo (PointPlus (x, y) (xi, yi)) wh) col) = (Body (BodyGeo (PointPlus (x + xi, y + yi) (xi, yi)) wh) col)
move
बेहतर का पहला संस्करण है वर्तमान में, यह इस प्रकार लिखा है ? वैसे भी, अगर move
केवल PointPlus
बदलता है, तो एक और फ़ंक्शन होना चाहिए जो इसे नए Body
के अंदर कॉल करता है। मैं समझाता हूं: एक समारोह update
है जिसे गेम स्थिति अपडेट करने के लिए कहा जाता है; यह वर्तमान खेल स्थिति, अब के लिए एक एकल Body
पारित किया गया है, और अद्यतन Body
देता है।
update (Body (BodyGeo (PointPlus xy (xi, yi)) wh) pict) = (Body (BodyGeo (move (PointPlus xy (xi, yi))) wh) pict)
जो मुझे गुदगुदी करता है। PointPlus
को छोड़कर सबकुछ Body
के भीतर ही रखा जाता है। हाथ से इस पूर्ण "पुनर्निर्माण" से बचने का कोई तरीका है? इस तरह:
update body = backInBody $ move $ pointPlus body
बेशक backInBody
को परिभाषित किए बिना।
यह सही है, खासकर स्वचालित पीढ़ी के साथ! 'चाल' फ़ंक्शन के बारे में क्या? क्या यह पूरी तरह से 'बॉडी' या केवल 'प्वाइंटप्लस' भाग लेने के लिए बेहतर है? – L01man
@ एल 01man मैं लेंस पर खान के एक ब्लॉग पोस्ट में आपके जैसा ही एक ठोस उदाहरण का वर्णन करता हूं [यहां] (http://www.haskellforall.com/2012/01/haskell-for-mainstream-programmers_28.html) –
आपके चरण-दर-चरण व्याख्या ने मुझे पूरी तरह से लेंस समझने में मदद की। – L01man