Programmation Fonctionnelle Avancée – Master 1 TP 1 Mehdi Dogguy – Tous les sujets de TP seront disponibles à cette adresse : http://www.pps.jussieu.fr/~dogguy/?page=teaching/pfa – Les lignes commençant par (?) sont des indications. Exercice 1 : Configuration d’Emacs Emacs dispose d’un mode Haskell qui porte le nom haskell-mode. Il faut dire à Emacs comment charger correctement le mode en vous aidant du code qui se trouve à l’adresse suivante : http://is.gd/haskell el Ajoutez le contenu de ce fichier à la fin de votre .emacs (et rechargez ce dernier). Ce mode fournit quelques fonctions utiles que l’on va découvrir tout au long de ce TP. (?) Le raccourci clavier C-c C-h permet de découvrir la liste des raccourcis clavier définis par le mode chargé. Exercice 2 : Listes Écrivez les fonctions suivantes sur les listes et donnez leur équivalent dans le prélude de Haskell : – appliquer :: (c -> d) -> [c] -> [d] qui prend en argument une fonction f et une liste l et qui retourne la liste où tous les éléments ont été tranformés avec f. – concatener :: [z] -> [z] -> [z] qui concatène deux listes. – longueur :: [a] -> Int qui calcule la longueur d’une liste. – somme :: [Int] -> Int qui calcule la somme des éléments d’une liste. Proposez une implémentation de somme qui utilise foldl. – combiner :: (a -> b -> c) -> [a] -> [b] -> [c] qui combine les éléments de deux listes avec la fonction donnée en premier argument. (?) La documentation de Prelude.hs est disponible à cette adresse http://is.gd/Prelude hs. (?) Le raccourci clavier C-c C-l permet de charger le fichier ouvert dans le mode interactif de Haskell. Exercice 3 : Perroquet Voici un programme qui imprime ce qu’il lit sur son entrée standard : main : : IO ( ) main = interact ( \ x −> x ) On peut compiler ce programme et obtenir un exécutable Exo1 de la manière suivante : $ ghc --make -fwarn-missing-signatures -Werror Exo1.hs Dans la suite, implémentez chacune des transformations demandées et recompilez votre programme : 1. Remplacez la fonction anonyme par une fonction définie localement. Vérifiez que votre programme fait toujours la même chose. 2. Transformez ce programme pour qu’il affiche le nombre de lignes lues. 3. Affichez le nombre de caractères par ligne. 4. Affichez le nombre de caractères par ligne (sans les espaces). 5. Affichez le nombre de caractères lus au total. 6. Affichez, au maximum, 80 caractères par ligne. 7. Reformattez le texte lu sur 80 colonnes. (?) C-c M-/ affiche interactivement la signature de l’identifiant pointé par le curseur. (?) C-c C-t demande à la boucle interactive d’afficher le type de l’identifiant pointé par le curseur. Exercice 4 : List comprehensions 1. Trouver la somme des entiers inférieurs à 1000 dont le carré est impair. 2. Trouver la liste des entiers n inférieurs à 100000 qui satisfont l’équation suivante : (n+2)2 = (n+1)2 + n2 . 3. Trouver la liste des entiers premiers inférieurs à 200. 4. Trouver la somme des multiples de 3 et 5 qui sont inférieurs à 100.