haskell exception-handling

¿Qué partes de Real World Haskell son ahora obsoletas o se consideran malas prácticas?



exception-handling (1)

Tema principal de RWH

Es viejo. RWH se escribió en el momento en que se usaba la versión 6.8 de GHC. 6.8 utilizó la versión base 3.0.xx 6.10.1 ya utilizada 4.0.0.0, que introdujo muchos cambios . Y eso es solo el salto de 6.8 a 6.10. La versión actual de GHC es 7.10. Las mónadas han sido cambiadas. Actualmente hay una discusión para eliminar el return de Monad , por lo que la instancia de Monad en Real World Haskell realmente no estará sincronizada con el mundo real.

Dicho esto, sigue siendo un recurso útil para las pautas generales. Pero tenga en cuenta que muchas bibliotecas han cambiado desde su lanzamiento.

Algo que puedes leer mientras lees RWH es "Lo que me gustaría saber al aprender Haskell" por Stephen Diehl . Proporciona información adicional, pero tenga en cuenta que algunas secciones no son realmente amigables 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 está funcionando.
  • Lea la documentación de las bibliotecas / funciones que desea usar. Incluso si eres perezoso, conoce al menos los tipos.

Comentarios a capítulos

Esta es solo una descripción rápida de algunas de las cosas que noté al leer RWH. Es probable que esté incompleto.

Capítulo 2. Tipos y funciones frente al FTP

Desde GHC 7.10 .

El tipo de null ha sido changed debido a la Foldable-Traversable-Proposal . Muchas otras funciones como foldr , foldl y muchas otras que anteriormente solo estaban definidas para [a] en el Prelude han sido reemplazadas por variantes más generales de Foldable t => ta .

Capítulo 11. Pruebas y garantía de calidad

Desde la plataforma Haskell 2010 o finales de 2008.

Aunque esto se menciona en una footnote a footnote , la biblioteca QuickCheck ha cambiado de muchas maneras desde la versión 1 a la versión 2. Por ejemplo, generate ahora usa Gen a lugar de StdGen y la funcionalidad de la generate está en Test.QuickCheck.Gen.unGen .

En duda, verifique la documentation .

Capítulo 14. Mónadas y Capítulo 15. Programación con mónadas

Código de ruptura: 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-Monad Proposal ( AMP ).

Ver 7.8.1 notas de la versión .

Las mónadas de State / Writer / Reader

En la Voluntad la mónada de estado real por favor ponte de pie? sección, los autores afirman

Para definir una instancia de Monad , debemos proporcionar un constructor de tipo apropiado, 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.

Capítulo 17. Interfaz con C: el 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:

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 malloc() debe usarse con free() , new con delete , allocate con deallocate , siempre se debe usar la función correcta.

TL; DR Debería siempre liberar memoria con el mismo asignador que le asignó.

Si una función externa asigna memoria, también debe usar la función de desasignación que la acompaña.

Capítulo 19. Manejo de errores

El manejo de errores cambió completamente de 6.8 a 6.10, pero ya lo notaste. Mejor leer la documentation .

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 creación de perfiles siguen siendo las mismas, y el ejemplo (ver a continuación) es un excelente estudio de caso para los problemas que pueden ocurrir en su programa. Pero a RWH le falta el perfil multiproceso, por ejemplo, a través de ThreadScope. Además, IO perezoso no se ocupa de 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 concurrente y paralela y STM)

Mientras que el Capítulo 24. Programación concurrente y multinúcleo y Capítulo 28. La memoria transaccional de software sigue siendo relevante, el libro de Simon Marlow Programación simultánea y paralela en Haskell se centra únicamente en la programación simultánea y paralela, y es bastante reciente (2013). La programación de GPU y reparación faltan por completo en RWH.

Capítulo 26. Diseño avanzado de la biblioteca: creación de un filtro Bloom

Al igual que con los otros capítulos, las pautas generales de la biblioteca de diseño todavía están bien escritas y son relevantes. Sin embargo, debido a algunos cambios (?) Con respecto a ST , el resultado ya no se puede compilar.

Capítulo 27. Programación de red

Todavía está mayormente actualizado. Después de todo, la programación de la red no cambia tan fácilmente. Sin embargo, el código usa las funciones obsoletas bindSocket y sClose , que deben ser reemplazadas por bind y close (preferiblemente a través de la 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 las bibliotecas de 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 te dice que obtengas GHC y Cabal a mano. No lo hagas En su lugar, siga las instrucciones en la página de descarga de haskell.org.

Además, el apéndice no le informa sobre las cajas de arena Cabal, que se introdujeron en Cabal 1.18 y lo liberan del infierno de la dependencia . Y, por supuesto, la stack falta por completo.

Falta contenido

Algunos temas no se tratan en absoluto en RWH. Esto incluye bibliotecas de transmisión como pipes y conduit , y también lenses .

Hay varios recursos para esos temas, pero aquí hay algunos enlaces a las presentaciones para darle una idea de lo que tratan. Además, si desea usar vectores, use el paquete de vectors .

Control.Applicative

RWH usa Control.Applicative ''s (<$>) en varios puntos, pero no explica Control.Applicative en absoluto. LYAH y Typeclassopedia contienen secciones en 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 clase de tipo propiamente dicha) ahora son parte del Prelude , así que asegúrese de que sus operadores no entren en conflicto con <$> , <*> y otros.

Lentes

Streaming de bibliotecas

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 de GHC

  • polimorfismo del tipo de tiempo de ejecución ( :i ($) ha cambiado enormemente)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • cualquier otra extensión que sucedió después de 6.6

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 en este libro sean obsoletas y que ya no valgan la pena estudiar, 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 darnos algunos consejos sobre qué partes del mismo ya no son relevantes? Especialmente los capítulos en la segunda mitad del libro, por ejemplo, memoria transaccional de software, programación concurrente, programación de socket, etc.

EDIT: se trata de la edición del libro que se publicó en diciembre de 2008, que es la única edición conocida hasta el día de hoy (noviembre de 2017)