Fin des fiches de Haskell.

Reste le miniprojet.
This commit is contained in:
Mysaa 2022-01-08 04:21:26 +01:00
parent c907bd74da
commit ac1d6b24e2
Signed by: Mysaa
GPG Key ID: DBA23608F23F5A10
4 changed files with 76 additions and 3 deletions

24
HSK22.md Normal file
View File

@ -0,0 +1,24 @@
# Haskell 22
### Exercice 1
1. Cette expression crée un type appelé `Vector` qui peut être instancié avec un seul constructeur: `Vec3` qui prend en paramètre trois flottants.
2.
```
magnitude :: Vector -> Float
magnitude (Vec3 a b c) = sqrt (a*a+b*b+c*c)^
```
### Exercice 2
1. Cette expression crée un type polymorphique de vecteur à trois coordonées, qui peuvent être de n'importe quel type.
2. L'expression donnée est donc du type `Vector [Char]`.
3. Là où cette autre expression est du type `Vector Int` (ou plutôt `Num t => Vector t`)
4. Celle ci est du type Vector Float (on a forcé le type d'un élément, donc de t, donc du vecteur).
5. `data Liste t = Liste Integer [t]`
6. `initListe = Liste 0 []`
7.
```
ajouteListe::Liste t -> t -> Liste t
ajouteListe (Liste n s) x = Liste (n+1) (x:s)
```
8. Cette liste permet d'implémenter la fonction `length` en temps constant, au prix d'un coût à peine plus élevé lors du l'ajout et un petit peu plus de mémoire.

24
HSK23.md Normal file
View File

@ -0,0 +1,24 @@
# Haskell 23
### Exercice 1
1. L'expression crée le type `Verité` qui n'a que deux constructeurs d'arité 0.
2. L'expression suivante crée un type `Arbre` défini inductivement comme étant soit une feuille, soit un nœud composé d'un flottant et de deux sous-arbres.
3. L'expression donnée crée une instance du type arbre construite par le constructeur `Noeud` avec comme valeurs le flottant 5, une instance du type arbre consturite par le constructeur `Noeud` avec comme valeur le flottant 2 et deux fois l'arbre contstruit par le constructeur `Feuille`, ainsi que une instance du type arbre construite par le constructeur `Noeud` avec comme valeur le flottant 7 et deux fois l'arbre construit par le constructeur `Feuille`.
4. On peut définir le type `data Arbre t = Noeud t (Arbre t) (Arbre t)`
5.
```
arbreSomme :: Num t => Arbre t -> t
arbreSomme Feuille = 0
arbreSomme (Noeud v a b) = v + (arbreSomme a) + (arbreSomme b)
```
6. Le type sur les arbres polymorphiques est donné ci-dessus. Pour les arbres Float, on aurait pour type `Arbre t -> t`
7. Ce type correspond à une valeur de type `t` qui peut ne pas avoir été renvoyée. C'est un espèce de `null` du langagae fonctionnel. Il est ou bien présent (`Just a`) ou absent (`Nothing`).
8. `head` sur une liste vide renvoie une exception.
9.
```
headSafe :: [t] -> Maybe t
headSafe [] = Nothing
headSafe (e:s) = Just e
```
10. `data Arbre t = Noeud t (Maybe (Arbre t)) (Maybe (Arbre t))`

14
HSK24.md Normal file
View File

@ -0,0 +1,14 @@
# Haskell 24
### Exercice 1
1. Cette expression crée le type `Vector t` et appele `print` sur une instance de ce type. Sauf que Haskell râle car le type susnommé n'a pas la classe `Show`.
2. En indiquant que Vector a la classe `Show`, alors ..... ben elle peut être affichée.
### Exercice 2
1. Dans la première expression, Haskell ne sait pas comment comparer ou tester l'égalité des éléments de type `Card` car le type n'est pas de la classe `Eq` ni `Ord`.
Dans le second cas, on a précisé les classes, donc Haskell est capable d'inférer les opérateurs d'égalité et de définition (se basant sur l'ordre des déclarations des constructeurs).
2. L'expression suivante crée un type Objet avec trois constructeurs, et définit comment l'objet instantie la classe `Eq`.
3.
- Pour définir `Eq`, il faut définir `==`
- Pour définir `Ord`, il faut définir `compare` de type `a -> a -> Ordering
- Pour définir `Show`, il faut définir `show` de type `a -> String`.

View File

@ -164,9 +164,20 @@ modifStrings l = [ case s of {
_ -> [last s] _ -> [last s]
} | s<-l] } | s<-l]
data Vector = Vec3 Float Float Float
magnitude :: Vector -> Float
magnitude (Vec3 a b c) = sqrt (a*a+b*b+c*c)
data Arbre t = Noeud t (Arbre t) (Arbre t) | Feuille
arbreSomme :: Num t => Arbre t -> t
arbreSomme Feuille = 0
arbreSomme (Noeud v a b) = v + (arbreSomme a) + (arbreSomme b)
headSafe :: [t] -> Maybe t
headSafe [] = Nothing
headSafe (e:s) = Just e