En el capítulo 19 de Real World Haskell, muchos de los ejemplos ahora fallan debido al cambio de Control.Exception.
Eso me hace pensar que tal vez algunas de las cosas de este libro son obsoletas y ya no vale la pena estudiarlas, después de todo, han pasado 6 años. Mi única otra referencia es Learn You a Haskell For Great Good , aunque es un gran libro, es mucho más básico en comparación con RWH.
¿Alguien que haya leído el libro antes puede dar algún consejo sobre qué partes del mismo ya no son relevantes? Especialmente los capítulos de la segunda mitad del libro, por ejemplo, memoria transaccional de software, programación concurrente, programación de sockets, etc.
EDITAR: Se trata de la edición del libro que se publicó en diciembre de 2008, que es la única edición conocida hasta la fecha (noviembre de 2017)
fuente

Monades una subclase deApplicative.Respuestas:
Problema principal de RWH
Es viejo. RWH se escribió en un momento en que se utilizaba la versión 6.8 de GHC. 6.8 usaba la versión base 3.0.xx 6.10.1 ya usaba 4.0.0.0, que introdujo muchos cambios . Y ese es solo el salto de 6.8 a 6.10. La versión actual de GHC es 7.10. Se han cambiado las mónadas. Hay actualmente una discusión para eliminar
returna partirMonad, por lo que elMonadcaso en el mundo real Haskell será realmente fuera de sincronía con el mundo real.Dicho esto, sigue siendo un recurso útil para las pautas generales. Pero tenga en cuenta que muchas bibliotecas cambiaron desde su lanzamiento.
Algo que puede leer mientras lee RWH es "Lo que desearía saber al aprender Haskell" de Stephen Diehl . Proporciona información adicional, pero tenga en cuenta que algunas secciones no son realmente adecuadas para los recién llegados.
Observaciones generales
Comentarios a los capítulos
Esta es solo una descripción general rápida de algunas de las cosas que noté mientras leía RWH. Probablemente esté incompleto.
Capítulo 2. Tipos y funciones frente al FTP
Desde GHC 7.10 .
El tipo de
nullse ha cambiado debido a la propuesta plegable-transitable . Muchas otras funciones comofoldr,foldly muchas otras que antes solo estaban definidas[a]en el,Preludehan sido reemplazadas porFoldable t => t avariantes más generales .Capítulo 11. Pruebas y garantía de calidad
Desde la plataforma Haskell 2010 o finales de 2008.
Aunque esto se menciona en una nota a pie de página , la biblioteca QuickCheck ha cambiado de muchas maneras de la versión 1 a la versión 2. Por ejemplo,
generateahora usa enGen alugar deStdGen, y la funcionalidad de la antiguagenerateestá enTest.QuickCheck.Gen.unGen.En caso de duda, consulte la documentación .
Capítulo 14. Mónadas y Capítulo 15. Programación con mónadas
Rompiendo el código:
Applicative m => Monad mA partir de GHC 7.10,
Applicativeahora es una superclase deMonadalgo que no se planeó en 2007.Consulte las notas de la versión 7.8.1 .
Las
State/Writer/ReadermónadasEn la ¿Se pondrá de pie la mónada inmobiliaria? sección, los autores afirman
Eso ya no es cierto, porque
Statey sus amigos ahora se implementan a través deEntonces están definidos por su transformador de mónada.
Capítulo 17. Interfaz con C: la FFI
El capítulo general está bien, pero como se puede leer en los comentarios o en el blog de Yuras Shumovich , la parte del finalizador en el siguiente código es una mala práctica:
Como se
malloc()debe usar confree(),newcondelete,allocatecondeallocate, siempre se debe usar la función correcta.Si una función externa asigna memoria, también debe usar la función de desasignación adjunta.
Capítulo 19. Manejo de errores
El manejo de errores cambió completamente de 6.8 a 6.10, pero ya lo notó. Mejor lee la documentación .
Capítulo 22. Ejemplo extendido: programación de cliente web
Algunos de los ejemplos parecen estar rotos. Además, hay otras bibliotecas HTTP disponibles.
Capítulo 25. Perfilado y optimización
Las técnicas generales de generación de perfiles siguen siendo las mismas, y el ejemplo (ver más abajo) es un gran caso de estudio para problemas que pueden ocurrir en su programa. Pero a RWH le faltan perfiles de subprocesos múltiples, por ejemplo, a través de ThreadScope. Además, la IO perezosa no se preocupa en todo el libro, hasta donde yo sé.
Capítulo 24 y Capítulo 28 (Programación simultánea y paralela y STM)
Mientras que el Capítulo 24. Programación concurrente y multinúcleo y el Capítulo 28. Memoria transaccional de software siguen siendo relevantes, el libro de Simon Marlow Programación paralela y concurrente en Haskell se centra únicamente en la programación concurrente y paralela y es bastante reciente (2013). La programación y reparación de GPU faltan por completo en RWH.
Capítulo 26. Diseño de biblioteca avanzado: creación de un filtro Bloom
Al igual que con los otros capítulos, las directrices generales de la biblioteca de diseño todavía están bien redactadas y son relevantes. Sin embargo, debido a algunos cambios (?) Relacionados
ST, el resultado ya no se puede compilar.Capítulo 27. Programación de redes
Todavía está casi actualizado. Después de todo, la programación de la red no cambia tan fácilmente. Sin embargo, el código usa funciones obsoletas
bindSocketysClose, que deben ser reemplazadas porbindyclose(preferiblemente a través de una importación calificada). Tenga en cuenta que es de muy bajo nivel, es posible que desee utilizar una biblioteca de alto nivel más especializada.Apéndice A. Instalación de bibliotecas GHC y Haskell
GHC 6.8 fue la última versión antes de que se introdujera la plataforma Haskell. Por lo tanto, el apéndice le dice que obtenga GHC y Cabal a mano. No lo hagas. En su lugar, siga las instrucciones de la página de descarga de haskell.org .
Además, el apéndice no le informa sobre los sandboxes de Cabal, que se introdujeron en Cabal 1.18 y lo liberan del infierno de la dependencia . Y por supuesto,
stackfalta por completo.Falta contenido
Algunos temas no se tratan en absoluto en RWH. Esto incluye bibliotecas de transmisión como tuberías y conductos , y también lentes .
Existen varios recursos para esos temas, pero aquí hay algunos enlaces a introducciones para darle una idea de qué tratan. Además, si desea utilizar vectores, utilice el
vectorspaquete.Control.ApplicativeRWH usa
Control.Applicative's(<$>)en varios puntos, pero no explicaControl.Applicativeen absoluto. LYAH y Typeclassopedia contienen secciones sobreApplicative. Dado queApplicativees una superclase deMonad(ver arriba), se recomienda aprender esa clase de memoria.Además, varios operadores de
Control.Applicative(y la propia clase de tipos) ahora forman parte dePrelude, así que asegúrese de que sus operadores no entren en conflicto con<$>,<*>y otros.Lentes
lens)Bibliotecas de transmisión
conduit)pipes, incluido en elpipespaquete)Estampación
stack, un programa multiplataforma para desarrollar proyectos Haskellghc-mod, un backend para vim, emacs, Sublime Text y otros editoresExtensiones de idioma nuevas / faltantes y cambios en GHC
:i ($)ha cambiado enormemente)-XTypeInType-XDataKinds-XGADT-XRankNTypes-XGenericNewtypeDeriving-XDeriveFunctorfuente