2017-09-28 8 views
6

में मोनाड को कैसे समझें मैं अभी समझ गया कि किस तरह के कन्स्ट्रक्टर और उच्च प्रकार के प्रकार बताते हैं और अब मैं मोनाड को समझने की कोशिश कर रहा हूं। मैं एक तरह से समझ में नहीं आता है क्यों Monad एक उच्च kinded प्रकार हैस्कैला

trait Monad[F[_]] extends Applicative[F] with Bind[F] { self => 
    //// 

    override def map[A,B](fa: F[A])(f: A => B) = bind(fa)(a => point(f(a))) 
    //The rest is omitted 

} 

प्रश्न: यहां बताया Monad विशेषता scalaz में दिखता है? हमारे पास मानक List[T], Option[T] मोनैड हैं जो उच्च प्रकार के प्रकार नहीं हैं।

मैं थ्योरी श्रेणी विशेषज्ञ नहीं हूं इसलिए मैं मोनैड को मोनैड कानूनों के साथ एक कंटेनर के रूप में मानता हूं।

trait Monad[V]{ 
    //... 
} 

नहीं एक उच्च तरह:

क्यों हम सिर्फ एक इकाई के रूप में इस की घोषणा नहीं है।

मानक Option[T] मोनैड उदाहरण के लिए उप-वर्ग के रूप में उस मामले में कैसा दिखता है?

+0

संक्षेप में, मानदंड को एक और पैटर्न मानें, जो स्कैला संग्रह पुस्तकालय के तहत डेटा मैनिपुलेशन को एकीकृत करता है। – Pavel

+0

@ पावेल ठीक है, लेकिन यह उच्च प्रकार का प्रकार क्यों है? –

+0

[स्कैला फ़ंक्शन और मोनाड मतभेद] का संभावित डुप्लिकेट (https: // stackoverflow।कॉम/प्रश्न/8460594/स्कैला-फ़ैक्टर-एंड-मोनैड-मतभेद) – Pavel

उत्तर

6

मुझे समझ में नहीं आता कि क्यों मोनड दयालु प्रकार है?

मुझे लगता है कि क्यों यह होना करने के लिए एक उच्च kinded प्रकार कोशिश करते हैं और pure के लिए एक हस्ताक्षर बनाने के लिए जहां प्रकार पैरामीटर एक प्रकार निर्माता ही नहीं है को देखने के लिए सबसे तेज़ तरीका:

// Doesn't compile 
trait Monad[V]{ 
    def pure[A](a: A): V[A] 
} 

बेशक, यह है क्योंकि हम V[A] एक मनमाना प्रकार पैरामीटर के लिए नहीं लिख सकता है काम नहीं करता है, यह एक प्रकार निर्माता, विशेष रूप से तरह * -> *

कैसे होगा मानक विकल्प [टी] इकाई नज़र lik में से एक हो गया है उदाहरण

के लिए एक उपवर्ग के रूप में उस मामले में ई एक इकाई (और उस बात के लिए एक functor) के बारे में एक और बात एक प्रकार निर्माता जा रहा है कि हम Monad[List] की एक एकल प्रतिनिधित्व बनाने के लिए, उदाहरण के लिए, और के लिए इसे पाने के है सभी T के लिए List के तर्कों के लिए मुफ्त में बहुलक प्रकार और तूफान मुक्त हैं। दोबारा, आप Monad के हस्ताक्षर के गुण के आधार पर इसे एक प्रकार के कन्स्ट्रक्टर के बिना कार्यान्वित नहीं कर सके।

हम मानक सूची [टी], विकल्प [टी] monads जो प्रकार नहीं उच्च kinded कर रहे हैं।

यह सही है। वे अधिक दयालु नहीं हैं क्योंकि T को List[T] या Option[T] के किसी भी परिचालन के लिए काम करने के लिए स्वयं को एक प्रकार का कन्स्ट्रक्टर होने की आवश्यकता नहीं है, लेकिन T उस अर्थ में किसी भी प्रकार का प्रतिनिधित्व कर सकता है। इसका मतलब है कि हालांकि Option[T] दयालु * -> * है, मैं अभी भी Option[List[T]] का उत्पादन करने के लिए इसे List के साथ बना सकता हूं।