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

107

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)

swang
fuente
2
AFAIK, la versión en línea de Real World Haskell se actualizará de vez en cuando. Quizás encuentres cosas más útiles en Haskell Wikibook .
Vektorweg
@Vektorweg La mayor parte del trabajo en Wikilibro hasta ahora se realizó en los capítulos introductorios (que cubren aproximadamente el mismo terreno que el nivel LYAH, aunque con una perspectiva diferente) y en la cobertura de temas más avanzados de teoría y sistemas de tipos. Para cuestiones aplicadas, como se ve en los capítulos posteriores de RWH, Swang se refiere, RWH es una mejor opción por ahora; aunque, como colaborador de Wikibook, espero que eso cambie eventualmente :)
duplode
1
@Vektorweg: No noté diferencias significativas entre la versión impresa y en línea. Además, la versión en línea no parece actualizarse en absoluto, el capítulo del filtro de floración se ha roto durante mucho tiempo (al menos en 2009). Dicho esto, Wikilibros, yay :).
Zeta
1
@Swang Tenga en cuenta que incluso Learn You a Haskell contiene material obsoleto, ahora que Monades una subclase de Applicative.
jub0bs
1
Por favor mencione la edición del libro. En general, siempre mencione la versión , la plataforma , el sistema operativo , la edición , etc. cuando hable de un producto.
Nawaz

Respuestas:

137

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 el Monadcaso 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 nullse ha cambiado debido a la propuesta plegable-transitable . Muchas otras funciones como foldr, foldly muchas otras que antes solo estaban definidas [a]en el, Preludehan sido reemplazadas por Foldable 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 en Gen alugar de StdGen, y la funcionalidad de la antigua generateestá 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, Applicativeahora es una superclase de Monadalgo que no se planeó en 2007.

En GHC 7.10, Applicativese 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/ Readermónadas

En la ¿Se pondrá de pie la mónada inmobiliaria? sección, los autores afirman

Para definir una Monadinstancia, 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 Statey 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: 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:

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(), newcon delete, allocatecon 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.

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é.

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.

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 bindSockety sClose, que deben ser reemplazadas por bindy 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.

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.Applicative

RWH usa Control.Applicative's (<$>)en varios puntos, pero no explica Control.Applicativeen absoluto. LYAH y Typeclassopedia contienen secciones sobre Applicative. Dado que Applicativees 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
Zeta
fuente
gracias, esto es exactamente lo que estaba buscando :), me recuerdas el problema de la mónada de estado, ya no tiene un constructor de valor de estado, me tomó un poco de cabeza para averiguar cuándo lo estaba leyendo.
swang
@swang: Todavía está lejos de estar completo. Quizás Bryan o Don sepan más sobre las funciones cambiadas. De cualquier manera, las pautas generales aún se mantienen.
Zeta
1
Para redes de alto nivel, prefiero redes simples .
Lambda Fairy
Existe una relación entre los "transductores", las corrutinas y los conductos de las bibliotecas de transmisión.
CMCDragonkai
¿Se considera obsoleto el uso de HDBC?
Janus Troelsen