Qué es Comonad, si es posible describirlo en la sintaxis de Scala. Encontré la implementación de la biblioteca scalaz, pero no está claro dónde puede ser útil.Ejemplo de Comonad en Scala
Respuesta
Bueno, mónadas permiten añadir valores a ellos, los cambia en base a un cálculo de un no-mónada a una mónada. Comonads le permite extraer valores de ellos y cambiarlos en función de un cálculo de comonad a non-comonad.
La intuición natural es que por lo general va aparecerá donde usted tiene un CM [A] y desea extraer A.
Ver this post muy interesante que toca comonads un poco por casualidad, pero, para mí en al menos, haciéndolos muy claros.
"La intuición natural es que generalmente aparecerán donde tengas un CM [A] y quieras extraer A". Eso es 'Copointed' /' Copure'. Añádalo 'extract' (' W [A] => (W [A] => B) => W [B] ') o' cojoin' ('W [A] => W [W [A]] '), y obtienes' Comonad'. – missingfaktor
@missingfaktor No los estoy definiendo, supongo que Stas ya ha visto la definición. Estoy diciendo que las comonads generalmente se encontrarán en situaciones como esta. –
Lo que sigue es una traducción literal del código de this publicación en el blog.
case class U[X](left: Stream[X], center: X, right: Stream[X]) {
def shiftRight = this match {
case U(a, b, C#:: cs) => U(b #:: a, c, cs)
}
def shiftLeft = this match {
case U(a #:: as, b, c) => U(as, a, b #:: c)
}
}
// Not necessary, as Comonad also has fmap.
/*
implicit object uFunctor extends Functor[U] {
def fmap[A, B](x: U[A], f: A => B): U[B] = U(x.left.map(f), f(x.center), x.right.map(f))
}
*/
implicit object uComonad extends Comonad[U] {
def copure[A](u: U[A]): A = u.center
def cojoin[A](a: U[A]): U[U[A]] = U(Stream.iterate(a)(_.shiftLeft).tail, a, Stream.iterate(a)(_.shiftRight).tail)
def fmap[A, B](x: U[A], f: A => B): U[B] = U(x.left.map(f), x.center |> f, x.right.map(f))
}
def rule(u: U[Boolean]) = u match {
case U(a #:: _, b, C#:: _) => !(a && b && !c || (a == b))
}
def shift[A](i: Int, u: U[A]) = {
Stream.iterate(u)(x => if (i < 0) x.shiftLeft else x.shiftRight).apply(i.abs)
}
def half[A](u: U[A]) = u match {
case U(_, b, c) => Stream(b) ++ c
}
def toList[A](i: Int, j: Int, u: U[A]) = half(shift(i, u)).take(j - i)
val u = U(Stream continually false, true, Stream continually false)
val s = Stream.iterate(u)(_ =>> rule)
val s0 = s.map(r => toList(-20, 20, r).map(x => if(x) '#' else ' '))
val s1 = s.map(r => toList(-20, 20, r).map(x => if(x) '#' else ' ').mkString("|")).take(20).force.mkString("\n")
println(s1)
Salida:
| | | | | | | | | | | | | | | | | | | |#| | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#| | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| |#| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#|#|#| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| | | |#| | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#| | |#|#| | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| |#| |#| |#| | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#|#|#|#|#|#|#| | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| | | | | | | |#| | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#| | | | | | |#|#| | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| |#| | | | | |#| |#| | | | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#|#|#| | | | |#|#|#|#| | | | | | | |
| | | | | | | | | | | | | | | | | | | |#| | | |#| | | |#| | | |#| | | | | | |
| | | | | | | | | | | | | | | | | | | |#|#| | |#|#| | |#|#| | |#|#| | | | | |
| | | | | | | | | | | | | | | | | | | |#| |#| |#| |#| |#| |#| |#| |#| | | | |
| | | | | | | | | | | | | | | | | | | |#|#|#|#|#|#|#|#|#|#|#|#|#|#|#|#| | | |
| | | | | | | | | | | | | | | | | | | |#| | | | | | | | | | | | | | | |#| | |
| | | | | | | | | | | | | | | | | | | |#|#| | | | | | | | | | | | | | |#|#| |
| | | | | | | | | | | | | | | | | | | |#| |#| | | | | | | | | | | | | |#| |#|
| | | | | | | | | | | | | | | | | | | |#|#|#|#| | | | | | | | | | | | |#|#|#|#
Falta la importación de 'Comonad'. '= >>' y '|>' no están definidos también. – EnverOsmanov
@EnverOsmanov, esta publicación es de una época en la que no me daba cuenta de la importancia de incluir importaciones en los fragmentos de código. :-) De todos modos, Scalaz ha cambiado enormemente desde entonces, y los paquetes han visto múltiples rondas de reorganización. Le agradecería si pudiera actualizar esta publicación según el nuevo Scalaz (o los gatos, si ese es su veneno). – missingfaktor
- 1. Scala por ejemplo?
- 2. ¿Hay algún ejemplo de juegos en Scala?
- 3. Ejemplo de reinicios anidados en Scala
- 4. Contravalor de Scala: ejemplo de vida real
- 5. Ejemplo de cliente-servidor con los actores de Scala
- 6. NoSQL (por ejemplo, MongoDB) o RDMS (por ejemplo, PostgreSQL) para el nuevo proyecto de Scala?
- 7. código de error en el código de ejemplo de "Beginning Scala"
- 8. ejemplo de uso de scala.collection.immutable.Set de java
- 9. Un ejemplo de procesamiento xml pero usando anti-xml en lugar de Scala xml
- 10. Scala AST en Scala
- 11. El sistema de tipos en Scala es Turing completo. ¿Prueba? ¿Ejemplo? Beneficios?
- 12. ¿Por qué Scala no puede inferir el parámetro de tipo en este ejemplo?
- 13. Scala por ejemplo: parámetro de tipo de rasgo con error de límites de contexto?
- 14. ¿Diferencia entre los tipos existenciales de Scala y el comodín de Java por ejemplo?
- 15. Alias de clase en scala
- 16. ejemplo
- 17. Clase de GroovyX.metaClass.getProperty en scala
- 18. Ejemplo de Scala para ayudar a solidificar el conocimiento del libro
- 19. Patrón de gancho en Scala
- 20. ¿Por qué este ejemplo de Scala del parámetro implícito no funciona?
- 21. función inversa en Scala
- 22. Texto de ejemplo en JTextField
- 23. Ejemplo de subprocesamiento en Android
- 24. Ejemplo de bloques en ios5
- 25. Ejemplo de DatePicker en android
- 26. Array inicializando en Scala
- 27. Publisher suscribirse en Scala
- 28. Agregado() ejemplo en R
- 29. UITextField Ejemplo en Cocos2d
- 30. Pregunta sobre el cierre de Scala (de "Programación en Scala")
Vea también: [¿Qué es la clase de tipo Comonad en Haskell] (http://stackoverflow.com/questions/8428554/what-is-the-comonad-typeclass-in-haskell). Scalaz generalmente intenta hacer las cosas como Haskell-ish como sea posible, por lo que esas publicaciones de blog pueden ayudar. –
Vea también: publicación reciente de reddit en/r/haskell [Una notación para Comonads] (http://www.reddit.com/r/haskell/comments/v6ik6/a_notation_for_comonads_orchard_mycroft_pdf/) –