« Premiers pas en OCaml/Fonctions » : différence entre les versions
Contenu supprimé Contenu ajouté
m Ortho |
+ ajout informations importantes |
||
Ligne 131 :
</source>
{{Attention |Avec_fond = oui| Il est important de bien comprendre ce résultat ''' int -> int -> int'''. }}
Il faut savoir que pour le type des fonctions '''le parentésage à droite est implicite'''. Pour plus de compréhension mettons des parenthèses à cette valeur.
'''(int -> (int -> int))'''
Imaginez que l'on passe à la fonction fxy qu'un seul paramètre : (2 -> (int -> int)) on récupère alors une fonction qui prend en entier en paramètre et retourne un entier en paramètre (int -> int).
<source lang="ocaml">
# fxy 2;;
- : int -> int = <fun>
</source>
Maintenant imaginez que l'on passe à la fonction fxy deux paramètres : (2 -> (5 -> int)) on récupère un entier.
<source lang="ocaml">
#((fxy 2) 5);;
# (fxy 2) 5;;
# fxy 2 5;;
- : int = 10
</source>
Vous remarquez ici que pour l'appel des fonctions '''le parenthésage à gauche est implicite'''.
C'est très important si vous prenez l'exemple suivant :
<source lang="ocaml">
# fxy 2 3 + 5;;
- : int = 11
</source>
La fonction rend 11 et non pas 16 (2 * 8)
OCaml a parenthésé comme ci-dessous.
<source lang="ocaml">
# ((fxy 2) 3) + 5;;
- : int = 11
</source>
Pire si vous mettiez
<source lang="ocaml">
# fxy 1+2 3;;
</source>
pour rechercher le produit 3*3. le parenthésage sera effectué comme ci-dessous.
<source lang="ocaml">
# (((fxy 1)+)2) 3;;
</source>
C'est pour cette raison qu'on a droit a une belle erreur de compilation.
<source lang="ocaml">
Error: This expression has type int -> int
but an expression was expected of type int
</source>
Pour corriger ce problème il faut mettre des parenthèses.
<source lang="ocaml">
# fxy (1+2) 3;;
- : int = 9
</source>
== Sucre syntaxique ==
|