2015-03-14 19 views
6

scalazKleisli[M[_], A, B], A => M[B] kodlu bir sarıcı olup, bu tür işlevlerin bileşimini sağlar. Örneğin, M[_] monad ise Kleisli[M, A, C] almak için >=> ile Kleisli[M, A, B] ve Kleisli[M, B, C] yazabilirim. Özetle, Kleisli, M belgesine bağlı olarak andThens filiki sağlar. Doğru mu ? Kleisli'u kullanmanın başka yararları var mı?Scalaz Kleisli kullanım avantajları

cevap

9

Örnek olarak iki avantaj vardır — Eminim başkalarıyla gelebilirsiniz. İlk olarak, Kleisli[M, ?, ?] ve ? => ? gibi farklı oklar üzerinde soyutlamak yararlı olabilir. Örneğin, bir endomorfizmi belirli sayıda uygulayacak bir genel işlev yazabilirim.

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

Şimdi bunu ör. Int => Int veya 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 
} 

Ve sonra: (. A =?> BKleisli[Option, A, B] için sadece bir takma olduğunu unutmayın)

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

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

İkincisi, F yaparsa Kleisli[F, ?, ?] bir monad örneğini olması, ayrıca yararlı olabilir. ReaderT ile monadik kompozisyonu nasıl kullanabileceğinizi gösteren bir örnek için my answer here'a bakın, bu sadece Kleisli için bir takma addır.

+0

Teşekkürler. Ben aşağıdaki gibi _grok_ için çalışacağız: (1) '' Kleisli' genel olarak farklı oklar (2) özel durumlar üzerinde bir soyutlama olarak: ör. ReaderT, okuyucu monad, vb. – Michael

+0

Eh, bir monad 'M',' Kleisli [M,?,?] '_an_ ok. –

+0

Anladım. Teşekkür ederim, – Michael