के लिए monads वी.एस. अनुप्रयोगी functors मान लीजिए मैं 2 दूरस्थ सेवाओं के डेटा इकट्ठा करना चाहते हैं, और जितनी जल्दी मैं प्रतिक्रिया की सेवा:वायदा
def loadUser: Future[User]
def loadData: Future[Data]
case class Payload(user: User, data: Data)
मैं समझता हूँ कि यह एक कार्यान्वित async कार्य क्रमिक रूप से:
for {
user <- loadUser
data <- loadData
} yield Payload(user,data)
यह एक इन्हें समानांतर रूप से कार्यान्वित जबकि क्योंकि async कार्य क्रमिक रूप से चाइने होने से पहले ट्रिगर कर रहे हैं डी:
val userF = loadUser
val dataF = loadData
for {
user <- userF
data <- dataF
} yield Payload(user,data)
अंतर हालांकि मेरे लिए थोड़ा बहुत निहित है और कोई इसे पहले नोटिस नहीं कर सकता है।
Applicatives भी काम को हल करती है
(loadUser |@| loadData) { Payload(_,_) }
कोई मुझे बता सकते हैं कि मैं नहीं बल्कि applicatives और monads के बीच का उपयोग करेंगे समानांतर async गणना प्रदर्शन करने के लिए? प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष क्या हैं?
मुझे लगता है कि लगता है की जरूरत है मूल रूप से अगर आपको कुछ कॉम्प्यूटेशन ए के आउटपुट की गणना करने के लिए कुछ कॉम्प्यूटेशन ए के आउटपुट की आवश्यकता होती है तो आप एक मोनड का उपयोग करते हैं। यदि आप सिर्फ दो अलग-अलग चीजों की गणना करना चाहते हैं और उन्हें गठबंधन करना चाहते हैं, तो आवेदक करेंगे। हालांकि यह विशेष रूप से आवेदकों के बारे में 'समानांतर' नहीं है, मैं तर्क दूंगा कि ऊपर दिए गए कारणों के लिए, मोनैड मूल रूप से अनुक्रमिक हैं। वहां यदि आपको वास्तव में समानांतर गणना की आवश्यकता है, तो शायद मोनैड शायद वह संरचना नहीं है जिसे आप ढूंढ रहे हैं। * लहरें हाथ * – melps
मेरा जवाब [यहां] (http://stackoverflow.com/a/19881777/334519) में कुछ प्रासंगिक चर्चा है। –
समांतर में 'भविष्य' कंप्यूशन चलाने के लिए मानक मुहावरे 'ज़िप' है: '((उपयोगकर्ता, डेटा) <- loadUser ज़िप लोडडेटा) उपज पेलोड (उपयोगकर्ता, डेटा)' – Kolmar