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
Monad
es 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
return
a partirMonad
, por lo que elMonad
caso 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
null
se ha cambiado debido a la propuesta plegable-transitable . Muchas otras funciones comofoldr
,foldl
y muchas otras que antes solo estaban definidas[a]
en el,Prelude
han sido reemplazadas porFoldable t => t a
variantes 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,
generate
ahora usa enGen a
lugar deStdGen
, y la funcionalidad de la antiguagenerate
está 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 m
A partir de GHC 7.10,
Applicative
ahora es una superclase deMonad
algo que no se planeó en 2007.Consulte las notas de la versión 7.8.1 .
Las
State
/Writer
/Reader
mónadasEn la ¿Se pondrá de pie la mónada inmobiliaria? sección, los autores afirman
Eso ya no es cierto, porque
State
y 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()
,new
condelete
,allocate
condeallocate
, 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
bindSocket
ysClose
, que deben ser reemplazadas porbind
yclose
(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,
stack
falta 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
vectors
paquete.Control.Applicative
RWH usa
Control.Applicative
's(<$>)
en varios puntos, pero no explicaControl.Applicative
en absoluto. LYAH y Typeclassopedia contienen secciones sobreApplicative
. Dado queApplicative
es 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 elpipes
paquete)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
-XDeriveFunctor
fuente