2010-01-02 15 views
23

(कैसे) सामान्य रूप से स्कैला में मोनैड का प्रतिनिधित्व करना संभव है (जैसे Monad हास्केल में टाइपक्लास)? क्या इस उद्देश्य के लिए trait Monad को परिभाषित करना किसी भी तरह से संभव है?स्कैला में मोनैड विशेषता

उत्तर

40

आप कुछ इस तरह की कोशिश कर सकते:

trait Monad[+M[_]] { 
    def unit[A](a: A): M[A] 
    def bind[A, B](m: M[A])(f: A => M[B]): M[B] 
} 

// probably only works in Scala 2.8 
implicit def monadicSyntax[M[_], A](m: M[A])(implicit tc: Monad[M]) = new { 
    private val bind = tc.bind(m) _ 

    def map[B](f: A => B) = bind(f compose tc.unit) 

    def flatMap[B](f: A => M[B]) = bind(f) 
} 

implicit object MonadicOption extends Monad[Option] { 
    def unit[A](a: A) = Some(a) 

    def bind[A, B](opt: Option[A])(f: A => Option[B]) = opt flatMap f 
} 

आप निश्चित रूप से किसी अन्य इकाई अपने दिल इच्छाओं के लिए इसी तरह की अंतर्निहित वस्तुओं को परिभाषित करेगा। हास्केल शब्दों में, आप Monad के बारे में सोच सकते हैं कि टाइपक्लास और MonadicOption उस प्रकार के वर्ग के एक विशेष उदाहरण के रूप में। monadicSyntax अंतर्निहित रूपांतरण यह दर्शाता है कि इस टाइपक्लास का उपयोग स्कैला के for के उपयोग की अनुमति देने के लिए किया जा सकता है-Monad टाइपक्लास को संतुष्ट करने वाली किसी भी चीज़ के साथ।

आम तौर पर बोलते हुए, स्केल मानक लाइब्रेरी में अधिकांश चीजें जो flatMap लागू करती हैं, मोनैड हैं। स्कैला एक सामान्य Monad टाइपक्लास परिभाषित नहीं करता है (हालांकि यह बहुत उपयोगी होगा)। इसके बजाए, यह for के उपयोग की अनुमति देने के लिए पार्सर की सिंटैक्टिक चाल पर निर्भर करता है- के साथ कुछ भी जो उचित विधियों को लागू करता है। विशेष रूप से, उन विधियों को map, flatMap और filter (या foreach और filter अनिवार्य रूप के लिए) हैं।

+0

धन्यवाद, यह मैं वास्तव में क्या ढूंढ रहा था। मैं सिर्फ सामान्य मोनैड फ़ंक्शंस और ट्रांसफार्मर को सामान्य तरीके से परिभाषित करना चाहता था ... – Dario

+3

आप वास्तव में किसी भी चीज़ के लिए इसका उपयोग नहीं कर रहे हैं, है ना? :-) गंभीरता से, मैं थोड़ी देर के लिए स्कैला के साथ काम कर रहा हूं, और मुझे पता चला है कि कई मामलों में हास्केल मोनाड टाइपक्लास का उपयोग करेगा, केवल लक्षणों और उप-प्रकार के कारण स्कैला में नहीं आते हैं। ऊपर दिए गए टाइपक्लास, जबकि ठंडा, निश्चित रूप से स्कैला में समस्याओं को हल करने के लिए मूर्खतापूर्ण तरीका नहीं होगा। –

+1

लेकिन वे आते हैं। वे हर समय आते हैं। दिन में दो बार, मुझे 'लिफ्टए 2' या 'अनुक्रम ए' चाहिए। अनुमोदित, इन्हें केवल मोनाड के बजाय आवेदक की आवश्यकता है, लेकिन फिर भी, यदि ये आपके प्रोग्रामिंग में नहीं आते हैं तो आपको कुछ बहुत सरल लिखना होगा। – Apocalisp

14

आपको scalaz प्रोजेक्ट दिलचस्प मिल सकता है; इसमें मोनैड के कार्यान्वयन के अलावा कई अन्य (कार्यात्मक) सामान भी हैं।

2

स्कैला अंतर्निहित मानकों के उपयोग के माध्यम से हास्केल के प्रकार वर्गों को समान शक्ति प्राप्त करता है, विशेष रूप से सीमाओं और संदर्भ सीमाओं को देखते हैं। आप Ordering और Numeric जैसे लक्षणों के साथ विशेष रूप से स्कैला 2.8 पर उपयोग में ऐसी चीजें देख सकते हैं।

ने कहा, Scalaz प्रोजेक्ट देखें। इसमें monads, functors, तीर ... पूरे Shebang है।

4

http://www.codecommit.com/blog/ruby/monads-are-not-metaphors

यहाँ इकाई पैटर्न और डेनियल ने स्काला में इसके कार्यान्वयन, जो स्वीकार कर लिया लिखा के बारे में एक उपयोगी और नहीं बल्कि लंबा लेख है इस सवाल का जवाब।

(जो StackOverflow की साइट-खोज की रहस्यमय तरीके के माध्यम से इस "प्राचीन" सवाल पर आते हैं के लिए।)

संबंधित मुद्दे