¿Por qué Scalaz usa símbolos complejos y no hay documentación en el código?
(3)
A veces miro a Scalaz y me resulta bastante difícil de entender para un programador principiante de Scala.
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 Scalaz?
¿Por qué usan tantos operadores que son ilegibles para la mayoría de las personas? Ni siquiera sé cómo escribir ★
o ☆
sin copiar / pegar. Y es solo un ejemplo porque hay muchos.
Algunas personas dicen que Scalaz era ilegible al principio, pero dos 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?
Al igual que con cualquier proyecto de código abierto, la única respuesta realmente verdadera y aceptable para "¿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 de si esta respuesta resultará en votos positivos o negativos. Experimento interesante).
Estoy de acuerdo en que Scalaz es mayormente indocumentado. El problema es que recopila una gran cantidad de conceptos avanzados de Haskell (y las matemáticas subyacentes) y documentarlos en detalle se convertiría en la escritura de todo un libro 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, probablemente lo encontrará aquí.
- Si no lo sabes, tendrás que aprenderlo en otro lugar.
Veamos su ejemplo: si conoce las categorías de Kleisli y cómo cada mónada da lugar a una, la definición es bastante autónoma. Si no lo haces, entonces KleisliCategory
no tiene ningún uso para ti 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 / imperativa de Java que desordena un poco las cosas).
Teniendo en cuenta los símbolos Unicode. En cuanto a las fuentes, parece que se usan solo como azúcar sintáctica o al menos tienen una contraparte que no sea 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.
Sin embargo, no estoy seguro 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 los símbolos ASCII puros.
Un lugar para comenzar es leer Learn You a Haskell que cubre muchos conceptos.
Vea las charlas 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 incluso más fáciles para comenzar con scalaz que la validación, que son los diversos enriquecimientos en la Opción como ~ foo que devuelve el valor contenido en la opción o el ''cero'' para el tipo de las opciones (0 para números, cadena vacía para Cadena etc).
Me olvidé de una serie muy detallada de artículos llamados Learning Scalaz en http://eed3si9n.com/