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 el Monad
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
- Lee los comentarios. Por lo general, contienen información sobre si el párrafo / sección dado sigue siendo relevante y / o funciona.
- Lea la documentación de las bibliotecas / funciones que desea utilizar. Incluso si eres vago, conoce al menos los tipos.
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 como foldr
, foldl
y muchas otras que antes solo estaban definidas [a]
en el, Prelude
han sido reemplazadas por Foldable t => t a
variantes más generales .
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 en Gen a
lugar de StdGen
, y la funcionalidad de la antigua generate
está en Test.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 de Monad
algo que no se planeó en 2007.
En GHC 7.10, Applicative
se convertirá en una superclase de Monad
, potencialmente rompiendo una gran cantidad de código de usuario. Para facilitar esta transición, GHC ahora genera advertencias cuando las definiciones entran en conflicto con la propuesta de mónada aplicativa ( AMP ).
Consulte las notas de la versión 7.8.1 .
Las State
/ Writer
/ Reader
mónadas
En la ¿Se pondrá de pie la mónada inmobiliaria? sección, los autores afirman
Para definir una Monad
instancia, debemos proporcionar un constructor de tipo adecuado, así como definiciones para (>>=)
y return
. Esto nos lleva a la definición real de State
.
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
Eso ya no es cierto, porque State
y sus amigos ahora se implementan a través de
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
Entonces están definidos por su transformador de mónada.
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:
pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
then do
err <- peekCString =<< peek errptr
return (Left err)
else do
reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
return (Right (Regex reg str))
Como se malloc()
debe usar con free()
, new
con delete
, allocate
con deallocate
, siempre se debe usar la función correcta.
TL; DR Siempre debe liberar memoria con el mismo asignador que la asignó por usted.
Si una función externa asigna memoria, también debe usar la función de desasignación adjunta.
El manejo de errores cambió completamente de 6.8 a 6.10, pero ya lo notó. Mejor lee la documentación .
Algunos de los ejemplos parecen estar rotos. Además, hay otras bibliotecas HTTP disponibles.
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é.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
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.
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
y sClose
, que deben ser reemplazadas por bind
y close
(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.
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 explica Control.Applicative
en absoluto. LYAH y Typeclassopedia contienen secciones sobre Applicative
. Dado que Applicative
es una superclase de Monad
(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 de Prelude
, así que asegúrese de que sus operadores no entren en conflicto con <$>
, <*>
y otros.
Lentes
Bibliotecas de transmisión
Estampación
- versión 1.18 de Cabal, que introdujo sandboxes
stack
, un programa multiplataforma para desarrollar proyectos Haskell
ghc-mod
, un backend para vim, emacs, Sublime Text y otros editores
Extensiones de idioma nuevas / faltantes y cambios en GHC
- polimorfismo de tipo de ejecución (
:i ($)
ha cambiado enormemente)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- cualquier otra extensión que sucedió después de 6.6