2013-03-04 7 views
7

में एज़ोन के साथ आंशिक जेसन ऑब्जेक्ट्स को पार्स करना मैं हास्केल में वारप (और संभवतः स्कॉटी) और एसिड-स्टेट के साथ काफी सरल सीआरयूडी वेब सेवा बना रहा हूं।हैकेल

एसिड-स्टेट में मैं डेटा रिकॉर्ड में उपयोगकर्ता रिकॉर्ड स्टोर करता हूं (this उदाहरण के अनुसार)। मुझे पता है कि वे रिकॉर्ड हमेशा सृजन पर पूरा हो जाएंगे, इसलिए मुझे शायद बहुत से योग्यता प्राप्त करने की आवश्यकता नहीं है। हालांकि, उपयोगकर्ता को अपडेट करते समय, क्लाइंट आंशिक जेसन ऑब्जेक्ट भेजना चुन सकता है, केवल कुछ फ़ील्ड आबादी के साथ।

क्या यह प्रतिनिधित्व करने के लिए मुहावरेदार तरीका क्या होगा? मैं एक डेटा घोषणा, FullUser, Maybes बिना और ठीक एक सभी वैकल्पिक चाबियाँ, PartialUser के सामने Maybes के साथ एक ही होना चाहिए, और स्वचालित रूप aeson जाने बाद के लिए एनकोड और डीकोड निकाले जाते हैं, अंत में प्रकार के अपने खुद के अद्यतन समारोह लेखन :: FullUser -> PartialUser -> FullUser?

यह बहुत अधिक कोड नहीं होगा, लेकिन यह थोड़ा बदसूरत लगता है और जैसे यह थोड़ा सा DRY का उल्लंघन करता है। यह एक वेब सर्वर में इतना आम काम होना चाहिए, तो शायद यह पहले से ही हल हो चुका है (संभवतः TH के साथ)?

मुझे एहसास है कि मैं सिर्फ जेसन स्ट्रिंग को स्टोर कर सकता हूं और हमेशा लापता कुंजी की जांच कर सकता हूं, जिससे इसे थोड़ा गड़बड़ कर दिया जा सकता है लेकिन स्कीमा में बदलाव के लिए भविष्य का सबूत है, लेकिन मैं अभी भी जानना चाहता हूं कि मैं इसे कैसे सुरक्षित करूं " मार्ग।

संपादित करें: या शायद मैं सिर्फ FullUser है और aeson लेंस का प्रयोग कर एक FullUser और एक json स्ट्रिंग से एक सरल अद्यतन समारोह लिखने के लिए करना चाहिए?

उत्तर

7

मुहावरेदार हास्केल जितना संभव हो उतना स्थिर जाँच कर रही है। आपको हमेशा अपनी समस्या से परिप्रेक्ष्य जांच को प्रतिस्थापित करना संभव है या नहीं। यह अनिवार्य रूप से हस्केल के बारे में निम्नलिखित बयान को वास्तविकता के करीब बनाता है: "यदि यह संकलित करता है, तो यह काम करता है"। तो निश्चित रूप से सादा JSON के साथ काम करने के लिए एक "नहीं"।

FullUser और PartialUser के साथ आपका समाधान सही है। - इस तरह से आप एक काफी वर्णनात्मक और उचित अर्थ मिल User और UserJSON: हालांकि मैं एक अलग नामकरण तरीका अपनाने का सुझाव देते हैं।

हालांकि एसन के साथ एक छोटी सी समस्या है: जेनरेट किए गए उदाहरण don't yet support parsing missing fields (कृपया, इस मुद्दे पर वोट दें)। तो आपको मैन्युअल रूप से उदाहरणों को परिभाषित करना होगा।

+0

आपके इनपुट के लिए धन्यवाद! हाँ, नामकरण सिर्फ प्रश्न को स्पष्ट करने के लिए था। चूंकि जेनरेट किए गए उदाहरण इस मामले में पर्याप्त नहीं होंगे, मुझे लगता है कि मैं एक अपडेट फ़ंक्शन के साथ जाऊंगा जो एक पूर्ण यूज़र और एक जेसन स्ट्रिंग लेता है और इसे अपडेट करने के लिए एसन-लेंस (और शायद फुलयूसर के लिए एक लेंस) का उपयोग करता है। – Gurgeh