25 lines
1.4 KiB
Markdown
25 lines
1.4 KiB
Markdown
# 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))`
|