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)
Monad
une sous-classe deApplicative
.Réponses:
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
return
deMonad
, de sorte que l'Monad
exemple 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
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
null
a été changé en raison de la proposition pliable-traversable . De nombreuses autres fonctions telles quefoldr
,foldl
et de nombreuses autres qui n'étaient auparavant définies que pour[a]
dans lePrelude
ont été remplacées par desFoldable t => t a
variantes 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,
generate
utilise maintenant à laGen a
place deStdGen
, et la fonctionnalité de l'anciengenerate
est dansTest.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,
Applicative
est maintenant une superclasse deMonad
, quelque chose qui n'était pas prévu en 2007.Voir les notes de version 7.8.1 .
Les
State
/Writer
/Reader
monadesDans la Monade de l'État réel, veuillez vous lever? section, les auteurs affirment
Ce n'est plus vrai, car
State
et ses amis sont désormais implémentés viaIls 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:
Comme
malloc()
il faut l'utiliser avecfree()
,new
avecdelete
,allocate
avecdeallocate
, il faut toujours utiliser la fonction correcte.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.
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
bindSocket
etsClose
, qui doivent être remplacées parbind
etclose
(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
stack
manque 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
vectors
package.Control.Applicative
RWH utilisations
Control.Applicative
« s(<$>)
en plusieurs points, mais n'explique pasControl.Applicative
du tout. LYAH et la Typeclassopedia contiennent des sections surApplicative
. Étant donné qu'ilApplicative
s'agit d'une superclasse deMonad
(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 dePrelude
, alors assurez-vous que vos opérateurs ne sont pas en conflit avec<$>
,<*>
et d'autres.Lentilles
lens
)Bibliothèques en streaming
conduit
)pipes
, inclus dans lepipes
package)Outillage
stack
, un programme multiplateforme pour le développement de projets Haskellghc-mod
, un backend pour vim, emacs, Sublime Text et autres éditeursExtensions de langue nouvelles / manquantes et modifications du GHC
:i ($)
a énormément changé)-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
la source