מידע

מועד הגשה אין מועד הגשה
מגבלת הגשות אין הגבלה

כניסה

[1.1] Inférence de types

Types

Haskell est un langage fonctionnel fortement typé. À la compilation, il vérifie pour chaque fonction si le type déclaré correspond au type du corps de la fonction. À l'exécution, il réduit les expressions pour obtenir leur valeur.

Type Notation Valeur Opérations et remarques
entiers Int, Integer 1, -3 +, -, *, -, mod, div
réels Float, Double 5.2, 3.5E-2 +, -, *, -, /, cos, atan
booléens Bool True, False not, ||, &&
caractères Char 'a', ';', '\'  
chaînes String "Haskell" Synonyme de [Char]
tuples (a, b), (a, b, c) (3,True), ([1,8],'h')  
listes [a]

[]

0:0:5:[]

[1, 2, 3]

[1..5]

[1.3, 1.6..5]

Constructeurs : [] et :

++, head, tail, null, !!

Listes de mêmes types uniquement

fonctions a -> b

\x -> x * 3

\x y -> x + y

Application : f x y == (f x) y

a -> b -> c == a -> (b -> c)

Composition : .

Fonctions

En Haskell, la déclaration et la définition de fonctions suit cette syntaxe :

nom :: type
nom arguments = expression

Vous notez qu'une fonction est une expression, qui a donc un type et une valeur.

Exemples

double :: Integer -> Integer
double x = 2 * x

division :: Integer -> Integer -> Double
division dividende diviseur = dividende / diviseur

trois :: Integer
trois = 3

Le troisième exemple montre qu'une constante n'est qu'une fonction sans argument.

Opérateurs

Voici la liste des opérateurs les plus utilisés en Haskell, avec leur précédence et leur associativité :

Précédence Opérateur Associativité
9 !! à gauche : x!!y!!z équivaut à (x!!y)!!z
9 . à droite : f.g.h équivaut à f.(g.h)
8 ^, ^^, ** à droite
7 *, /, `div`, `mod` à gauche
6 +, - à gauche
5 :, ++ à droite
4 ==, /=, <, >, >=, <=, `elem`  
3 && à droite
2 || à droite
0 $ à droite
  • Transformation d'un opérateur infixe en fonction : (+), (==)
  • Transformation d'une fonction en opérateur infixe : `mod`
  • Application partielle d'une fonction : (1+), (div 1000), (`mod` 2)

Expressions conditionnelles

Expression Syntaxe Remarques
Expression conditionnelle if C then E1 else E2 E1 et E2 sont des expressions de même type
Définition locale
f = E1
  where x1 = E2
        x2 = E3

E1 contient les variables x1 et x2, pas encore assignées

Note : x1 et x2 doivent être alignées (utilisez des espaces)


שאלה 1:

Quel est le type de l'expression suivante et de chacune de ses variable ?

t == 'T' || y == "T"
שאלה 2:

Quel est le type de l'expression suivante et de sa variable ?

if x == 3.25 then [] else 3:[]
שאלה 3:

Quel est le type de l'expression suivante et de sa variable ?

if y then (2, y) else (3.5, y)
שאלה 4:

Quel est le type de l'expression suivante et de sa variable ?

\x -> x * 19
שאלה 5:

Quel est le type de l'expression suivante et de sa variable ?

\x -> x ++ " et " ++ x
שאלה 6:

Quel est le type de l'expression suivante et de sa variable ?

\x -> sin x - 3
שאלה 7:

Quel est le type de l'expression suivante et de sa variable ?

\x -> x 6 - 1
שאלה 8:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\(x, y) -> x*x + if y then 12 else 11
שאלה 9:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x -> \y -> x * 12.5 * y
שאלה 10:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x -> \y -> x && y == 33
שאלה 11:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x -> \y -> x:"Puis":y
שאלה 12:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x (y, z) -> (x - y, x : z)
שאלה 13:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x y -> y : tail x
שאלה 14:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x y -> x y + 1
שאלה 15:

Quel est le type de l'expression suivante et de chacune de ses variable ?

(>5.5) x && (*2) y == z
שאלה 16:

Quel est le type de l'expression suivante et de sa variable ?

\x -> x.x
שאלה 17:

Quel est le type de l'expression suivante et de chacune de ses variable ?

\x y -> (x.head) y