2015-03-14 13 views
6

In scalazKleisli[M[_], A, B] è un wrapper di A => M[B], che consente la composizione di tali funzioni. Ad esempio, se M[_] è monad, posso comporre Kleisli[M, A, B] e Kleisli[M, B, C] con >=> per ottenere Kleisli[M, A, C].Benefici di utilizzo di Scalaz Kleisli

In breve, Kleisli fornisce fantasia andThens a seconda di M. È corretto ? Esistono altri vantaggi dell'utilizzo di Kleisli?

risposta

9

Ecco due vantaggi come esempi: sono sicuro che potresti venire con gli altri.

In primo luogo, può essere utile astrarre su diverse frecce, come ad esempio Kleisli[M, ?, ?] e ? => ?. Ad esempio, posso scrivere una funzione generica che applicherà un endomorfismo un certo numero di volte.

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

Ora posso utilizzare questo ad es. Int => Int o 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 
} 

E poi: (. Si noti che A =?> B è solo un alias per Kleisli[Option, A, B])

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

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

In secondo luogo, il fatto che Kleisli[F, ?, ?] ha un'istanza monade se F fa può anche essere utile. Vedere ad esempio my answer here per una dimostrazione di come è possibile utilizzare la composizione monadica con ReaderT, che è solo un alias per Kleisli.

+0

Grazie. Proverò a _grok_ it come segue: (1) 'Kleisli' in generale come un'astrazione su frecce diverse (2) casi speciali: ad es. 'ReaderT', reader monad, ecc. – Michael

+0

Bene, per una monade' M', 'Kleisli [M,?,?]' È _an_ arrow. –

+0

Capito. Grazie, – Michael