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

Contenu supprimé Contenu ajouté
Watermy (discussion | contributions)
m →‎Qu'est-ce qu'une fonction ? : changement de titre (pouvait prêter à confusion)
Watermy (discussion | contributions)
+ définition locale, exemple...
Ligne 6 :
| suivant = [[../Fonctions/]]
}}
 
Ce chapitre est le plus important de la leçon. N'hésitez pas à le relire plusieurs fois et effectuer le quiz dédié au fonction.
 
== Les fonctions ==
=== Qu'est-ce qu'une fonction ? ===
Les fonctions OCaml sont très proches des [[w:Fonction_(mathématiques_élémentaires)|fonctions mathématiques]].
Par exemple <math>f(x) = x</math> <br />
s'écrit en OCaml
<source lang="ocaml">function x -> x;;</source>
 
Les fonctions (ou abstractions) sont défini par la syntaxe suivante :
 
Ligne 91 ⟶ 98 :
 
== Définition et fonctions ==
 
Nous pouvons maintenant donner un nom à nos fonctions.
{{Définition
| titre=Définition locale
|contenu=
<source lang="ocaml">
# let <nom de la fonction> = function <parametre> = <expression>;;
 
val <nom de la fonction> : <type paramètre entré> -> <type de l'expression de la fonction> = <fun>
</source>
}}
 
Reprenons l'exemple de la fonction successeur et lui donnant un nom
<source lang="ocaml">
# let successeur = function x -> x + 1;;
 
val successeur : int -> int = <fun>
</source>
 
{{Attention|Avec_fond = oui|1=Il est très important de comprendre ici le résultat de l'interpréteur. Disséquons élément par élément.
* '''val successeur''' : 'Successeur' est le du nom de la définition.
* ''': int -> int''' : La fonction prend un entier en paramètre et donne un entier en sortie.
* ''' = <fun> ''' : La valeur de la définition est une fonction.
}}
 
== Fonctions à plusieurs paramètres ==
Une fonction à plusieurs paramètres peut être vu comme une suite de fonction à un paramètre.
<source lang="ocaml">
# let fxy = function x -> function y -> x*y;;
 
val fxy : int -> int -> int = <fun>
</source>
 
{{Attention |Avec_fond = oui| Il est important de bien comprendre ce résultat ''' int -> int -> int'''
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.
}}
 
Et pour l'appel de la fonction il suffit de lui donner 2 paramètres :
<source lang="ocaml">
# fxy 2 5;;
 
- : int = 10
</source>
 
== Sucre syntaxique ==
Il y a un raccourci d'écriture pour les fonctions.
 
{{Définition
| titre=Sucre syntaxique
|contenu=
<source lang="ocaml">
# let <nom de la fonction> <paramètre 1> ... <paramètre n> = <expression> ;;
 
val <nom de la fonction> : <type paramètre entré> -> <type de l'expression de la fonction> = <fun>
</source>
}}
 
<source lang="ocaml">
# let fxy = function x -> function y -> x*y;;
(* = *)
# let fxy x y = x * y;;
 
val fxy : int -> int -> int = <fun>
</source>
C'est plus court mais je vous déconseille de l'utiliser tant que vous ne maîtriser pas encore les fonctions.
 
== Déterminer le type d'une fonction ==
 
Vous avez le type d'une fonction ? Vous souhaitez connaître le type de ses arguments sans chercher dans la documentation ?
Il suffit simplement de marquer le nom de la fonction de l'interpréteur pour récupérer son type.
 
<source lang="ocaml">
# fxy;;
 
- : int -> int -> int = <fun>
</source>
 
Et cela marche aussi pour les opérateurs.
 
<source lang="ocaml">
# (+);;
 
- : int -> int -> int = <fun>
</source>
 
Pour tester vos connaissances sur les fonctions je vous conseil d'effectuer le premier quiz dédié au fonction.
 
== Référence ==