scala functional-programming scalaz scalaz7

Encontrando mi camino a través de Scalaz



functional-programming scalaz7 (4)

Posible duplicado:
Buena introducción de scalaz

Me gustaría aprender más acerca de Scalaz, posiblemente utilizando Scalaz7 para evitar volver a cablear mi cerebro una vez que se declare estable. Mi problema es que Scalaz contiene mucha funcionalidad. Si bien la mayor parte está destinada a ser independiente de otras partes, me gustaría tener una visión general de la funcionalidad global que ofrece Scalaz y cómo está organizada. Que yo sepa, Scalaz ofrece, entre otras cosas,

  • Functor , Applicative y de Monad .
  • nuevas mónadas como Validation (editar: resulta que es solo un aplicativo)
  • transformadores de mónada ( OptionT , EitherT ....)
  • Itereatee s
  • Lens es
  • Zipper s

Además de esto, hay muchas conversiones implícitas y nuevos constructores, como some que se superponen con la biblioteca estándar pero se comportan mejor con respecto a los tipos

:type Some(3) // Some[Int] :type some(3) // Option[Int]

Tengo un conocimiento básico de la mayoría de estas construcciones, pero no domino ninguno de los conceptos.

¿Tiene alguna sugerencia en qué orden para aprender la biblioteca, qué dependencias lógicas existen entre los módulos? Más generalmente, ¿dónde puedo encontrar una descripción general de alto nivel de la biblioteca?

EDITAR Parece que la mayoría de las respuestas están dirigidas a aprender los componentes básicos de la programación funcional, como las mónadas, por lo que trataré de ser más preciso. Tengo un conocimiento básico de Haskell y antecedentes matemáticos, por lo que mi problema no está relacionado con la teoría de categorías o la programación funcional básica.

Mi problema es que Scalaz es una enorme biblioteca. No sé qué encontrar dónde, qué métodos están disponibles o son útiles en varios tipos de datos. Lo que realmente necesito es un mapa que, por ejemplo, me dirá que cuando quiero recorrer los recursos que deben eliminarse, es posible que desee considerar las iteraciones y qué tipo de operaciones puedo hacer con eso. Más como una panorámica de la funcionalidad disponible con la biblioteca.



Mi consejo sería que no esperes hasta que sientas que tienes un alto nivel de comprensión de la biblioteca; para empezar, elige un par de herramientas y luego sigue los enlaces conceptuales a medida que avanzas.

Validation (que por cierto no es en realidad una mónada ) es probablemente el mejor lugar para comenzar. Si alguna vez ha usado Either de los Either para la validación en la biblioteca estándar, la Validation resultará familiar y mucho más conveniente. Encontrará muchas discusiones útiles sobre la Validation here on y en elsewhere .

Una vez que se sienta cómodo trabajando con la Validation , debe tener una buena comprensión básica de la clase de tipo de functor aplicativo, que es útil en muchos otros contextos.

Monoid es otro buen punto de partida. Es una clase de tipo muy simple (esencialmente solo una operación asociativa y un elemento de identidad), y una vez que lo entiendas verás monoides en todas partes. Vea, por ejemplo, esta respuesta (revelación completa: es por mí) que muestra cómo usar los monoides para resolver un problema que inicialmente podría no parecer muy monoidea.

Hay muchas otras herramientas pequeñas y útiles en Scalaz que puedes usar sin necesidad de comprender todo el panorama general. Bifunctor es uno de mis favoritos: hace que trabajar con tuplas sea mucho más conveniente al brindarle una forma de asignar una función en cada lado:

scala> import scalaz._, Scalaz._ import scalaz._ import Scalaz._ scala> def inc(i: Int) = i + 1 inc: (i: Int)Int scala> def repeat(n: Int)(s: String) = s * n repeat: (n: Int)(s: String)String scala> (inc(_)) <-: (1, "a") :-> repeat(3) res0: (Int, String) = (2,aaa)

Una vez que tenga una buena comprensión de algunos de estos conceptos, le sugeriré a Brent Yorgey''s Typeclassopedia , que está orientado a Haskell pero que hace un trabajo fantástico al darle la suficiente teoría de categorías y álgebra abstracta para entender la mayoría de las cosas que usted conoce. Encontraré en Scalaz.



Si bien nunca alejaría a nadie de los tutoriales de Haskell, pueden ser un poco alucinantes si eres un desarrollador al estilo OOP y no estás familiarizado con el motivo por el que querrías vivir en un mundo funcional.

Di una charla llamada "scalaz For the Rest of Us" que se acerca a scalaz a través de ejemplos con los que todos están familiarizados: memoization (Memo en scalaz), validación de dominio (Validation en scalaz), etc. De esa manera, el "caso de uso" es claro y puede comenzar a aprender cómo resolver los problemas familiares usando el poder de scalaz.