mónada monadas leibniz las filosofia educatina doctrina generics scala functional-programming

generics - leibniz - monadas filosofia



Rasgo de la mónada en Scala (5)

Eche un vistazo a http://www.scala-lang.org/api/current/index.html#scala.collection.generic.FilterMonadic . Una clase de caso ya está incorporada en el lenguaje y se usa ampliamente en todas las colecciones ...

(¿Cómo) es posible representar las mónadas en Scala de una manera genérica (como la clase de Mónadas en Haskell)? ¿Es posible de alguna manera definir una trait Monad para este propósito?


Podrías probar algo como esto:

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 }

Por supuesto, definirías objetos implícitos similares para cualquier otra mónada que tu corazón desee. En términos de Haskell, puedes pensar en Monad como la clase de tipos y en MonadicOption como una instancia particular de esa clase de tipos. La conversión implícita de monadicSyntax simplemente demuestra cómo se puede utilizar esta clase de tipos para permitir el uso de Scala for comprensiones con cualquier cosa que satisfaga la clase de tipos de Monad.

En términos generales, la mayoría de las cosas en la biblioteca estándar de Scala que implementan flatMap son mónadas. Scala no define una clase de tipos de Monad genérica (aunque sería muy útil). En su lugar, se basa en un truco sintáctico del analizador para permitir el uso de comprensiones for todo lo que implemente los métodos apropiados. Específicamente, esos métodos son map , flatMap y filter (o foreach y filter para la forma imperativa).


Scala logra un poder similar al de las clases de tipos de Haskell mediante el uso de parámetros implícitos, particularmente los límites de vista y los límites de contexto. Puede ver estas cosas en uso, especialmente en Scala 2.8, con rasgos como Ordering y Numeric .

Dicho esto, mira el proyecto scalaz . Tiene mónadas, funtores, flechas ... todo shebang.


Usted puede encontrar el proyecto scalaz interesante; Tiene muchas otras cosas (funcionales), además de una implementación de mónadas.


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

Este es un artículo útil y bastante extenso sobre el patrón de Monad y su implementación en Scala por Daniel, quien escribió la respuesta aceptada para esta pregunta.

(Para aquellos que se topan con esta pregunta "antigua" a través de las formas místicas de la búsqueda en el sitio de ).