2015-03-14 4 views
6

scalazKleisli[M[_], A, B]A => M[B] का एक रैपर है, जो इस तरह के कार्यों की संरचना की अनुमति देता है। उदाहरण के लिए, यदि M[_] मोनैड है तो Kleisli[M, A, C] प्राप्त करने के लिए >=> के साथ Kleisli[M, A, B] और Kleisli[M, B, C] लिख सकता है।स्कालाज़ क्लेस्ली उपयोग लाभ

संक्षेप में, KleisliM के आधार पर फैंसी andThens प्रदान करता है। क्या यह सही है ? Kleisli का उपयोग करने के अन्य लाभ हैं?

उत्तर

9

यहां उदाहरण के रूप में दो लाभ हैं-मुझे यकीन है कि आप दूसरों के साथ आ सकते हैं।

सबसे पहले, यह Kleisli[M, ?, ?] और ? => ? जैसे विभिन्न तीरों पर सार के लिए उपयोगी हो सकता है। उदाहरण के लिए, मैं एक सामान्य कार्य लिख सकता हूं जो एक निश्चित समय पर एंडोमोर्फिज्म लागू करेगा।

def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) = 
    List.fill(10)(Endomorphic(f)).suml 

अब मैं इसका उपयोग उदाहरण पर कर सकता हूं Int => Int या Kleisli[Option, Int, Int]:

val f = (_: Int) + 1 

val k = Kleisli.kleisli[Option, Int, Int] { 
    case i if i % 2 == 0 => Some(i * 3) 
    case _ => None 
} 

और फिर: (। ध्यान दें कि A =?> B सिर्फ Kleisli[Option, A, B] के लिए एक उपनाम है)

scala> applyX10(f).run(1) 
res0: Int = 11 

scala> applyX10[=?>, Int](k).run(2) 
res1: Option[Int] = Some(118098) 

दूसरा, तथ्य यह है Kleisli[F, ?, ?] अगर F करता है एक इकाई उदाहरण है भी उपयोगी हो सकता है। उदाहरण के लिए my answer here देखें कि आप ReaderT के साथ मोनैडिक संरचना का उपयोग कैसे कर सकते हैं, जो Kleisli के लिए केवल एक उपनाम है।

+0

धन्यवाद। मैं निम्नानुसार _grok_ करने की कोशिश करूंगा: (1) 'क्लेस्ली' सामान्य रूप से अलग-अलग तीरों (2) विशेष मामलों पर एक अमूर्तता के रूप में: उदा। 'रीडर टी', रीडर मोनड, आदि – Michael

+0

ठीक है, एक मोनड 'एम' के लिए, 'क्लेस्ली [एम,?,?] '_an_ तीर है। –

+0

समझ गया। धन्यवाद, – Michael

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