¿Por qué Scalaz utiliza símbolos complejos y no tiene documentación en código?


A veces estoy mirando Scalaz y me resulta bastante difícil de entender para un programador de Scala principiante.

  implicit def KleisliCategory[M[_]: Monad]: Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] {
    def id[A] = ☆(_ η)
    def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
  }

  implicit def CokleisliCategory[M[_]: Comonad]: Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] {
    def id[A] = ★(_ copure)
    def compose[X, Y, Z](f: Cokleisli[M, Y, Z], g: Cokleisli[M, X, Y]) = f =<= g 
  }

Los métodos de Scalaz pueden parecer obvios para los programadores funcionales experimentados, pero para cualquier otra persona es difícil de entender.

¿Por qué hay tan poca documentación en el código de Scalaz?

¿Por qué usan tantos operadores que son ilegibles para la mayoría de la gente? Ni siquiera sé cómo escribir o sin copiar/pegar. Y es solo un ejemplo porque hay son muchos.

Algunas personas dicen que Scalaz era ilegible al principio, pero 2 años después lo encuentran genial. Me pregunto por dónde empezar con Scalaz. La validación de Scala parece la parte más fácil, pero después de eso?

Author: Beryllium, 2012-10-21

3 answers

Estoy de acuerdo en que Scalaz es mayormente indocumentado. El problema es que recopila muchos conceptos avanzados de Haskell (y las matemáticas subyacentes) y documentarlos en detalle se convertiría en escribir un libro completo sobre programación funcional (y matemáticas). Así que creo que el enfoque de Scalaz es:

  • Si conoce y necesita algún concepto de programación funcional preparado para Scala, lo más probable es que lo encuentre aquí.
  • Si no lo sabes, tendrás que aprenderlo en otro lugar.

Echemos un vistazo a tu ejemplo: Si conoces las categorías Kleisli y cómo cada mónada da lugar a una, la definición es bastante autocontenida. Si no lo hace, entonces KleisliCategory no tiene ningún uso para usted de todos modos.

(En mi experiencia, Haskell es mejor para aprender conceptos avanzados de la programación funcional. Si bien Scala es mucho mejor que Java, todavía arrastra alrededor de la herencia OO/imperativo de Java que estorba las cosas a trozo.)


Considerando los símbolos Unicode. Mirando las fuentes parece que se utilizan solo como un azúcar sintáctico o al menos tienen una contraparte no Unicode:

def ☆[M[_], A, B](f: A => M[B]): Kleisli[M, A, B] = kleisli(f)
def η[F[_]](implicit p: Pure[F]): F[A] = pure
def cokleisli[W[_], A, B](f: W[A] => B): Cokleisli[W, A, B] = ★(f)

Así que puedes ir sin ellos, si quieres.

Aún así, no estoy seguro de si tenerlos en Scalaz es una buena idea. Podría hacer que el código sea imposible de leer para alguien que carece de las fuentes adecuadas. Prefiero símbolos ASCII puros.

 13
Author: Petr Pudlák,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-31 14:37:49

Un lugar para comenzar es leer Aprender un Haskell que cubre muchos conceptos.

Mira las conversaciones de Chris Marshall (@oxbow_lakes) scalaz: http://skillsmatter.com/expert/scala/chris-marshall

Obtenga una copia de la Programación Funcional en Scala de Manning escrita por algunos de los autores de scalaz.

Tengo un par de pequeños ejemplos en mi blog http://www.casualmiracles.com/blog/

Yo diría que hay lugares aún más fáciles para comenzar con scalaz que la validación, que es los varios enriquecimientos en la opción como ~foo que devuelve el valor contenido en la opción o el 'cero' para el tipo de opciones (0 para números, cadena vacía para Cadena, etc.).

Me olvidé de una serie muy detallada de artículos llamados Aprendizaje Scalaz en http://eed3si9n.com /

 7
Author: Channing Walton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-22 06:28:44

Al igual que con cualquier proyecto de código abierto, la única respuesta realmente verdadera y aceptable a "¿Por qué no es su mejor documentación?"es" Porque nadie lo ha escrito todavía. Eres libre de ser voluntario."

(Honestamente no tengo idea si esta respuesta resultará en votos positivos o votos negativos. Interesante experimento.)

 5
Author: Dave Griffith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-21 22:06:02