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
- 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 null
a été changé en raison de la proposition pliable-traversable . De nombreuses autres fonctions telles que foldr
, foldl
et de nombreuses autres qui n'étaient auparavant définies que pour [a]
dans le Prelude
ont été remplacées par des Foldable t => t a
variantes plus générales .
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 à la Gen a
place de StdGen
, et la fonctionnalité de l'ancien generate
est 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, Applicative
est maintenant une superclasse de Monad
, quelque chose qui n'était pas prévu en 2007.
Dans GHC 7.10, Applicative
deviendra 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
/ Reader
monades
Dans la Monade de l'État réel, veuillez vous lever? section, les auteurs affirment
Afin de définir une Monad
instance, 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 State
et 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.
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()
, new
avec delete
, allocate
avec 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.
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 .
Certains exemples semblent brisés. En outre, il existe d'autres bibliothèques HTTP disponibles.
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.
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
et sClose
, qui doivent être remplacées par bind
et 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.
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 pas Control.Applicative
du tout. LYAH et la Typeclassopedia contiennent des sections sur Applicative
. Étant donné qu'il Applicative
s'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