projprog/HSK13.md
2022-01-03 12:06:30 +01:00

2.7 KiB

Haskell 13

Exercice 1

  1. Le pattern matching est un moyen d'extraire des variables d'une variable composite comme une liste, un tuple par exemple. Cela permet aussi de vérifier qu'une variable a bien une forme donnée, ou de faire une disjonction de cas.
  2. Cela permet d'écrire des fonctions très proches de la notation mathématiques et très simple à écrire et surtout à comprendre ca très visuelles.
greaterTwo :: [Char] -> Bool
greaterTwo "one" = False
greaterTwo "two" = False
greaterTwo _ = True
  1. Les motifs sont lus dans l'ordre dans lequel ils ont été écrits. C'est à dire que les premiers motifs prévalent.
divide :: Fractional a => Eq a => a -> a -> a
divide _ 0 = -9999
divide p q = p/q

Exercice 2

myand :: Bool -> Bool -> Bool
myand False False = False
myand True False = True
myand False True = True
myand True True = False

myand2 :: Bool -> Bool -> Bool
myand2 False b = b
myand2 True b = not b

Exercice 3

compVectOld :: (Double,Double) -> (Double,Double) -> Double
compVectOld u v = ((fst u) + (fst v)) * ((snd u) + (snd v))

compVect :: Real a => (a,a) -> (a,a) -> a
compVect (x,y) (w,z) = (x+y)*(w+z)

L'intéret du pattern matching est de rendre la lecture et la compréhension du code beaucoup plus simple.

Exercice 4

Voir fstfunc.hs

Exercice 5

Voir fstfunc.hs

Exercice 6

  1. OK
  2. Pour ajouter un élément en tête de liste, il suffit d'utiliser l'opérateur cons dénoté par :.
  3. Le premier pattern correspond uniquement à la liste vide. Le second correspond à toute liste avec pour dernier constructeur cons. Ce qui veut dire qu'il correspond à toute liste non vide (il n'y a que deux constructeurs). La variable de tête est assignée au nom x et le reste est ignoré.
  4. Correspondent toutes les listes non vides.

Exercice 7

twoEq :: Eq a => [a] -> [a] -> Bool
twoEq (x:_) (y:_) = (x==y)
twoEq [] [] = True
twoEq _ _ = False
  1. Les éléments doivent être de la classe Eq afin de pouvoir être comparés.

Exercice 8

myLength :: PrintfType r => [a] -> r
myLength [] = printf "The list has no elements\n"
myLength [x] = printf "The list has one element\n"
myLength [x,y] = printf "The list has two elements\n"
myLength _ = printf "The list has more than two elements\n"
  1. Les objets doivent étendrent la classe Show pour être affichés.

myLengthShow :: PrintfType r => Show a => [a] -> r
myLengthShow [] = printf "The list has no elements\n"
myLengthShow [x] = printf "The list has one element: %s\n" (show x)
myLengthShow [x,y] = printf "The list has two elements: %s and %s\n" (show x) (show y)
myLengthShow _ = printf "The list has more than two elements\n"