# Haskell 7 ### Exercice 1 1. Houla. On peut définir une fonction comme une relation binaire fonctionelle, c'est à dire une partie de X*Y telle pour tout x dans X, y y' dans Y, x en relation avec y et x en relation avec y' implique y=y'. Sinon, on peut définir une fonction comme étant un «mapping», un boîte qui à un élément de l'entrée associe un élément de la sortie. C'est aussi un morphisme d'ensembles du point de vu de la théorie des catégories. 2. La fonction sort a pour entrée une `int list` et pour sortie aussi une `int list`. La fonction renvoie alors la liste ordonée ayant exactement les même éléments que son entrée. 3. `(+) 3 4` appelle la fonction `(+)` (version préfixée de `+`) de type `int -> int -> int` en lui envoyant l'entier `3` (qui renvoie une fonction du type `int -> int`) et appliquant ce résultat à l'entier `4`. 4. On peut conclure .... que les opérateurs ne sont que des écritures infixées de fonctions et n'ont pas d'autre différence fondamentale. Il en va de même pour tout ce qu'on a vu: `-`,`*`, mais aussi `++`. ### Exercice 2 1. Le texte `Prelude` dans l'invite de commande GHCi indique ce qui est chargé avant l'évaluation d'expressions Haskell. Par défaut, il y a uniquement un seul module, appelé `Prelude` contenant les opérations de base. 2. Avec un prélude vide, pour appeler les fonctions disponibles, on peut donner leur nom complet, c'est à dire avec le nom du module les englobant. Par exemple `Data.List.sort`. On peut aussi appeler `import Nom.Du.Module` afin de l'ajouter au prélude et d'ainsi pouvoir ignorer le nom complet et indiquer uniquement le nom de la fonction. 3. `Prelude Data.List> mod 4 3` 4. `Prelude Data.List> even 42` 5. `Prelude Data.List> gcd 18 12` 6. `Prelude Data.List> head [2,56,4,9]` 7. `Prelude Data.List> last [2,56,4,9]` 8. `Prelude Data.List> tail [2,56,4,9]` 9. `Prelude Data.List> length [2,56,4,9]` 10. `Prelude Data.List> reverse [2,56,4,9]` 11. `Prelude Data.List> maximum [2,56,4,9]` 12. `Prelude Data.List> elem 3 [2,56,4,9]` 13. `Prelude Data.List> concat [[5,7],[67,87]]` 14. `Prelude Data.List> take 3 [2,56,4,9]` 15. `Prelude Data.List> drop 2 [2,56,4,9]` 16. `Prelude Data.List> fst (45,"Orleans")` 17. `Prelude Data.List> snd (45,"Orleans")` ### Exercice 3 1. `Prelude> :load fstfunc.hs` 2. `*Main> addTwo 3` 3. Cette fonction peut prendre en entrée tout type étant une instance de la classe `Num`, à savoir `Word`, `Integer`, `Int`, `Float` et `Double`.