Quelles parties de Real World Haskell sont désormais obsolètes ou considérées comme de mauvaises pratiques?

107

Dans le chapitre 19 de Real World Haskell, de nombreux exemples échouent désormais en raison du changement de Control.Exception.

Cela me fait penser que certains éléments de ce livre sont peut-être obsolètes et ne valent plus la peine d'être étudiés, après tout cela fait 6 ans. Ma seule autre référence est Learn You a Haskell For Great Good , bien que ce soit un excellent livre, il est beaucoup plus basique que RWH.

Quelqu'un qui a déjà lu le livre peut-il donner des conseils sur les parties de celui-ci qui ne sont plus pertinentes? Surtout les chapitres de la seconde moitié du livre, par exemple, la mémoire transactionnelle logicielle, la programmation simultanée, la programmation de socket, etc.

EDIT: Il s'agit de l'édition du livre publié en décembre 2008, qui est la seule édition connue à ce jour (novembre 2017)

swang
la source
2
AFAIK, la version en ligne de Real World Haskell sera mise à jour de temps en temps. Peut-être trouverez-vous des informations plus utiles dans le Wikibook Haskell .
Vektorweg
@Vektorweg La plupart du travail sur le Wikibook jusqu'à présent a été fait dans les chapitres d'introduction (qui couvrent à peu près le même terrain que le niveau LYAH, mais avec une approche différente) et dans la couverture de sujets plus avancés sur la théorie et le système de types. Pour les problèmes appliqués, comme on le voit dans les derniers chapitres de RWH swang fait référence, RWH est un meilleur choix pour le moment; même si, en tant que contributeur de Wikibook, j'espère que cela changera à terme :)
duplode
1
@Vektorweg: Je n'ai pas remarqué de différences significatives entre la version imprimée et la version en ligne. De plus, la version en ligne ne semble pas du tout être mise à jour, le chapitre du filtre de floraison est interrompu depuis longtemps (au moins 2009). Cela étant dit, Wikibooks, yay :).
Zeta
1
@Swang Notez que même Learn You a Haskell contient des éléments obsolètes, maintenant c'est Monadune sous-classe de Applicative.
jub0bs
1
Veuillez mentionner l' édition du livre. En général, mentionnez toujours la version , la plate - forme , l' OS , l' édition, etc. lorsque vous parlez d'un produit!
Nawaz

Réponses:

137

Numéro principal de RWH

C'est vieux. RWH a été écrit à un moment où la version 6.8 de GHC était utilisée. 6.8 utilisait la version de base 3.0.xx 6.10.1 déjà utilisé 4.0.0.0, qui a introduit de nombreux changements . Et ce n'est que le saut de 6,8 à 6,10. La version actuelle de GHC est la 7.10. Les monades ont été modifiées. Il y a actuellement une discussion à retirer returndeMonad , de sorte que l' Monadexemple dans le monde réel Haskell va vraiment être synchronisé avec le monde réel.

Cela étant dit, c'est toujours une ressource utile pour les directives générales. Mais gardez à l'esprit que de nombreuses bibliothèques ont changé depuis sa sortie.

Quelque chose que vous pouvez lire en lisant RWH est "Ce que je souhaite savoir en apprenant Haskell" par Stephen Diehl . Il fournit des informations supplémentaires, mais sachez que certaines sections ne sont pas vraiment adaptées aux nouveaux arrivants.

Remarques générales

  • Lisez les commentaires. Ils contiennent généralement des informations indiquant si le paragraphe / la section donné est toujours pertinent et / ou fonctionnel.
  • Lisez la documentation des bibliothèques / fonctions que vous souhaitez utiliser. Même si vous êtes paresseux, connaissez au moins les types.

Remarques aux chapitres

Ceci est juste un bref aperçu de certaines des choses que j'ai remarquées en lisant RWH. C'est probablement incomplet.

Chapitre 2. Types et fonctions par rapport au FTP

Depuis GHC 7.10 .

Le type de nulla été changé en raison de la proposition pliable-traversable . De nombreuses autres fonctions telles que foldr, foldlet de nombreuses autres qui n'étaient auparavant définies que pour [a]dans le Preludeont été remplacées par des Foldable t => t avariantes plus générales .

Chapitre 11. Essais et assurance qualité

Depuis Haskell-platform 2010 ou fin 2008.

Bien que cela soit mentionné dans une note de bas de page , la bibliothèque QuickCheck a changé à bien des égards de la version 1 à la version 2. Par exemple, generateutilise maintenant à la Gen aplace de StdGen, et la fonctionnalité de l'ancien generateest dans Test.QuickCheck.Gen.unGen.

En cas de doute, consultez la documentation .

Chapitre 14. Monades & Chapitre 15. Programmation avec des monades

Rupture de code: Applicative m => Monad m

À partir de GHC 7.10, Applicativeest maintenant une superclasse de Monad, quelque chose qui n'était pas prévu en 2007.

Dans GHC 7.10, Applicativedeviendra une superclasse de Monad, potentiellement cassant beaucoup de code utilisateur. Pour faciliter cette transition, GHC génère désormais des avertissements lorsque les définitions entrent en conflit avec la proposition de la Monade Applicative ( AMP ).

Voir les notes de version 7.8.1 .

Les State/ Writer/ Readermonades

Dans la Monade de l'État réel, veuillez vous lever? section, les auteurs affirment

Afin de définir une Monadinstance, nous devons fournir un constructeur de type approprié ainsi que des définitions pour (>>=)et return. Cela nous amène à la vraie définition de State.

-- file: ch14/State.hs
newtype State s a = State
    runState :: s -> (a, s)
}

Ce n'est plus vrai, car Stateet ses amis sont désormais implémentés via

type State  s = StateT  s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity

Ils sont donc définis par leur transformateur monade.

Chapitre 17. Interfaçage avec C: le FFI

Le chapitre global est très bien, mais comme on peut le lire dans les commentaires ou sur le blog de Yuras Shumovich , la partie finaliseur dans le code suivant est une mauvaise pratique:

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))

Comme malloc()il faut l'utiliser avec free(), newavec delete, allocateavec deallocate, il faut toujours utiliser la fonction correcte.

TL; DR Vous devez toujours libérer de la mémoire avec le même allocateur qui vous l'a alloué.

Si une fonction étrangère alloue de la mémoire, vous devez également utiliser la fonction de désallocation qui l'accompagne.

Chapitre 19. Gestion des erreurs

La gestion des erreurs a complètement changé de 6.8 à 6.10, mais vous l'avez déjà remarqué. Mieux vaut lire la documentation .

Chapitre 22. Exemple étendu: programmation du client Web

Certains exemples semblent brisés. En outre, il existe d'autres bibliothèques HTTP disponibles.

Chapitre 25. Profilage et optimisation

Les techniques générales de profilage sont toujours les mêmes, et l'exemple (voir ci-dessous) est une excellente étude de cas pour les problèmes qui peuvent survenir dans votre programme. Mais RWH manque de profilage multi-thread, par exemple via ThreadScope. Aussi, lazy IO n'est pas concerné dans tout le livre, pour autant que je sache.

mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)

Chapitre 24 et Chapitre 28 (Programmation simultanée et parallèle et STM)

Alors que le chapitre 24. Programmation simultanée et multicœur et le chapitre 28. Mémoire transactionnelle logicielle sont toujours pertinents, le livre de Simon Marlow, Programmation parallèle et simultanée dans Haskell, se concentre uniquement sur la programmation simultanée et parallèle et est assez récent (2013). La programmation GPU et le repa sont complètement absents de RWH.

Chapitre 26. Conception de bibliothèque avancée: création d'un filtre Bloom

Comme pour les autres chapitres, les directives générales de la bibliothèque de conception sont toujours bien rédigées et pertinentes. Cependant, en raison de quelques changements (?) Concernant ST, le résultat ne peut plus être compilé.

Chapitre 27. Programmation réseau

Il est encore largement à jour. Après tout, la programmation réseau ne change pas si facilement. Cependant, le code utilise des fonctions obsolètes bindSocketet sClose, qui doivent être remplacées par bindet close(de préférence via une importation qualifiée). Gardez à l'esprit que c'est de très bas niveau, vous voudrez peut-être utiliser une bibliothèque de haut niveau plus spécialisée.

Annexe A. Installation des bibliothèques GHC et Haskell

GHC 6.8 était la dernière version avant l'introduction de la plate-forme Haskell. Par conséquent, l'annexe vous dit de vous procurer GHC et Cabal à la main. Ne fais pas ça. Suivez plutôt les instructions sur la page de téléchargement de haskell.org .

De plus, l'annexe ne vous parle pas des bacs à sable Cabal, qui ont été introduits dans Cabal 1.18 et vous libèrent de l'enfer des dépendances . Et bien sûr, il stackmanque complètement.

Contenu manquant

Certains sujets ne sont pas du tout abordés dans RWH. Cela inclut les bibliothèques de diffusion telles que les tuyaux et les conduits , ainsi que les objectifs .

Il existe plusieurs ressources sur ces sujets, mais voici quelques liens vers des introductions pour vous donner une idée de leur sujet. De plus, si vous souhaitez utiliser des vecteurs, utilisez le vectorspackage.

Control.Applicative

RWH utilisations Control.Applicative« s (<$>)en plusieurs points, mais n'explique pas Control.Applicativedu tout. LYAH et la Typeclassopedia contiennent des sections sur Applicative. Étant donné qu'il Applicatives'agit d'une superclasse de Monad(voir ci-dessus), il est recommandé d'apprendre cette classe par cœur.

De plus, plusieurs opérateurs de Control.Applicative(et la classe de types elle-même) font désormais partie de Prelude, alors assurez-vous que vos opérateurs ne sont pas en conflit avec <$>, <*>et d'autres.

Lentilles

Bibliothèques en streaming

Outillage

  • version 1.18 de Cabal, qui a introduit les bacs à sable
  • stack, un programme multiplateforme pour le développement de projets Haskell
  • ghc-mod, un backend pour vim, emacs, Sublime Text et autres éditeurs

Extensions de langue nouvelles / manquantes et modifications du GHC

  • polymorphisme de type d'exécution ( :i ($)a énormément changé)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • toute autre extension survenue après 6,6
Zeta
la source
merci, c'est exactement ce que je cherchais :), vous me rappelez le problème de la monade d'état, il n'a plus de constructeur de valeur d'état, m'a pris quelques soucis pour comprendre quand je le lisais.
swang
@swang: C'est encore loin d'être terminé. Peut-être que Bryan ou Don en savent plus sur les fonctionnalités modifiées. Quoi qu'il en soit, les directives générales sont toujours valables.
Zeta
1
Pour la mise en réseau de haut niveau, je préfère la simplicité du réseau .
Lambda Fairy
Il y a une relation entre les "transducteurs", les coroutines et les tuyaux de bibliothèques de streaming, conduit.
CMCDragonkai
L'utilisation de HDBC est-elle considérée comme obsolète?
Janus Troelsen