Salut,
En Caml, les fonctions sont currifiées (tu peux aussi jeter un coup d'oeil à l'article anglais qui est un peu différent), ce qui fait que les fonctions ne prennent qu'une seule variable.
Mais ça n'empêche pas du tout de travailler avec des fonctions de plusieurs variables ! Pour ça, tu as plusieurs solutions. Par exemple, pour définir f(x, y, z) :
- Soit tu exploites la curryfication, et tu notes :
Auquel cas ce qui va passer c'est que f va être une fonction qui à x associe une nouvelle fonction g (pour laquelle x est fixé) qui à y associe une nouvelle fonction h (x et y fixés) qui à z associe f(x, y, z).
Ca peut paraître compliqué mais en réalité tu n'as pas forcément à réfléchir à tout ça quand tu définis des fonctions, tu peux prendre ça comme une notation. Tu verras qu'on s'y fait très vite et que c'est pratique dans certaines situations
- Soit tu préfères considérer que ta fonction à n variables est une fonction qui à un n-uplet associe une valeur de retour. Auquel cas tu peux tout à fait noter :
Mais en réalité, ta fonction ne prend qu'un argument (le triplet (x, y, z)). Du coup tu aurais aussi bien pu noter :
Et ensuite utiliser des fonctions pour extraire l'élément voulu du triplet t. Mais c'est quand même plus simple de attribuer des noms à ces éléments si tu vas t'en servir dans le corps de ta fonction !
- Enfin, tu as une dernière possibilité : Si tu as beaucoup d'arguments et que tu ne veux pas avoir à te rappeler de l'ordre dans lequel tu dois les donner, tu peux utiliser des Label. Et si tu as des arguments qui prennent souvent la même valeur, si bien que tu ne veux pas avoir à la repréciser, tu peux donner des arguments par défaut. Exemple :
let f ?(z = 0.) ~x ~y = ...
Que tu appellerait comme ça :
ou
A noter que ta fonction ne peux pas comporter que des arguments optionnels, et que du coup du fait de la curryfication tu ne peux pas les donner en derniers (c'est pour ça que j'ai mis le ?(z = 0.) avant ~x et ~y
Voilà, il y a pas mal de doc sur la définition de fonctions un peu partout sur le net, je pense que tu devrais trouver ce dont tu as besoin...
Bonne chance !
Partager