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 ).