मेरे पास एक प्ले है! 2 स्कैला एप्लिकेशन के लिए जो बाहरी सेवा से जेएसओएन प्रारूप में कुछ डेटा पुनर्प्राप्त करने की आवश्यकता है।क्या मोनैड ट्रांसफार्मर सेवाओं से जेएसओएन प्राप्त करने के लिए आवेदन करते हैं?
Play! फ्रेमवर्क Promise में प्रतिक्रिया को लपेटकर HTTP अनुरोधों को असीमित रूप से करने की अनुमति देता है। Promise
एक मोनैड है जो एक मूल्य को लपेटता है जो भविष्य में उपलब्ध होगा।
यह ठीक है, लेकिन मेरे मामले में जो मुझे वेब सेवा से मिलता है वह एक JSON स्ट्रिंग है। मुझे इसे पार्स करना होगा और पार्सिंग असफल हो सकती है। इसलिए मुझे Option
में जो भी मिलता है उसे लपेटना होगा। नतीजा यह है कि मेरी कई विधियां Promise[Option[Whatever]]
लौट रही हैं। यही है, Whatever
प्रकार का मान जो बाद में उपलब्ध होगा।
अब जब भी मुझे इस तरह के मूल्य पर काम करना पड़ता है तो मुझे इसे दो बार map
की आवश्यकता होती है। मैं निम्नलिखित तरीके से इस से निपटने में सोच रहा था:
- एक नए प्रकार बनाने,
Hope[A]
कहते हैं, कि एकPromise[Option[A]]
- (
map
तरह प्रासंगिक तरीकों को परिभाषित करने या शायद मैंforeach
का उपयोग करें और कुछ संग्रह से विरासत चाहिए लपेटता विशेषता?) औरflatten
Promise[Option[A]]
औरHope[A]
के बीच एक अंतर्निहित कनवर्टर प्रदान करते हैं।
यह map
परिभाषित करने के लिए आसान है - दो functors की रचना फिर से एक functor है - और flatten
इस मामले में स्पष्ट रूप से किया जा सकता है, या जब भी Option
के साथ एक इकाई रचना।
लेकिन यह मेरी सीमित समझ है कि मुझे इस सामग्री को फिर से शुरू करने की आवश्यकता नहीं है: मोनाड ट्रांसफॉर्मर बिल्कुल इस मामले के लिए मौजूद है। या, ठीक है, तो मुझे लगता है - मैंने कभी भी एक मोनड ट्रैनफॉर्मर का उपयोग नहीं किया है - और यह प्रश्न का बिंदु है:
क्या इस स्थिति में मोनड ट्रैनफॉर्मर्स का उपयोग किया जा सकता है? मैं वास्तव में उनका उपयोग करने के बारे में कैसे जाउंगा?
धन्यवाद, ऐसा लगता है कि यह वही है जो मुझे चाहिए! – Andrea
मैंने कोशिश की है और सब कुछ मेरे आवेदन में ठीक काम करता है। केवल एक अजीब चीज है: यदि मैं अपने कार्यों के रिटर्न प्रकार को सरल बनाने के लिए एक प्रकार उपनाम 'प्रकार आशा [ए] = वादा [विकल्प [ए]]' पेश करता हूं, तो मुझे एक संकलन-समय त्रुटि मिलती है 'java.lang.IllegalArgumentException : हस्तांतरण के लिए सभी संग्रहों के समान आकार की आवश्यकता होती है। क्या आपके पास कोई सुराग है? – Andrea
@Andrea: यदि आप 'विकल्प टी' के साथ एक स्पष्ट प्रकार पैरामीटर का उपयोग करते हैं तो त्रुटि दूर होनी चाहिए। यह एक कंपाइलर बग की तरह दिखता है और यदि आपके पास समय है [समस्या ट्रैकर] (https://issues.scala-lang.org/secure/Dashboard.jspa) की जांच करना या यहां एक फॉलो-अप प्रश्न पूछना उचित हो सकता है। –