2010-12-04 18 views

Respuesta

16

scalaz.Monad, y la familia de clases de tipos relacionados, resumen algunas funcionalidades comunes en una gran variedad de tipos. Scalaz proporciona funciones de propósito general que funcionan para cualquieraMonad; y puedes escribir tus propias funciones de la misma manera.

Sin esta abstracción, se ve obligado a escribir estas funciones para cada nuevo tipo monádico que encuentre, p. Ej. List, Parser, Option. ¡Esto se vuelve tedioso!

Aquí hay ejemplos de algunas funciones proporcionadas, trabajando con un par de tipos monádicos. Mi favorito es sequence:

scala> 1.pure[Option].pure[Option] 
res1: Option[Option[Int]] = Some(Some(1)) 

scala> res1.join 
res2: Option[Int] = Some(1) 

scala> List(1.some, 2.some).sequence 
res3: Option[List[Int]] = Some(List(1, 2)) 

scala> List(1.some, none[Int]).sequence 
res4: Option[List[Int]] = None 

scala> List(1.pure[Function0])  
res5: List[() => Int] = List(<function0>) 

scala> res5.sequence 
res6:() => List[Int] = <function0> 

scala> res6() 
res7: List[Int] = List(1) 

scala> true.some ifM(none[Int], 1.some) 
res8: Option[Int] = None 

scala> false.some ifM(none[Int], 1.some) 
res9: Option[Int] = Some(1)