« Premiers pas en OCaml/Fonctions » : différence entre les versions

Contenu supprimé Contenu ajouté
Watermy (discussion | contributions)
m Ortho
Watermy (discussion | contributions)
+ 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))''' ('''Le parentésage à droite est implicite'''). On a donc une fonction qui prend en paramètre un entier et qui rend une fonction prend en paramètre un entier et qui rend un entier.
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>
Et pour l'appel de la fonction il suffit de lui donner 2 paramètres :
</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 ==