Bonjour, est-il possible de déclarer une fonction dans la définition d'une autre fonction ? Si oui, comment ? Merci d'avance !
Bonjour, est-il possible de déclarer une fonction dans la définition d'une autre fonction ? Si oui, comment ? Merci d'avance !
Ceci devrait répondre à ta question :
Toutefois, dans cet exemple, incr n'est pas accessible en dehors de la définition de f.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 let f x = let incr x = x+1 in incr (incr x);;
Et peut-on déclarer (toujours dans une fonction) une fonction dont la définition prend plusieurs lignes ? Et comment arrêter la définition de la fonction secondaire pour revenir à la définition de la fonction principale ?
Deux exemples tirés de mon tutoriel :
Code Caml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 let power x n = let rec loop acc n = if n=0 then acc else loop (acc *. x) (n-1) in loop 1. n;; let fibonacci n = let rec loop acc0 acc1 n = if n < 2 then acc1 else loop acc1 (acc0 + acc1) (n - 1) in loop 1 1 n;;
Salut !
Une réponse un peu plus centrée sur le « raisonnement » (un bien grand mot pour peu de choses ici) : dans les langages fonctionnels, les fonctions sont des éléments de première classe. Elles peuvent donc être manipulées comme n'importe quel type de base. Bref, aucune limitation théorique au contenu et aux imbrications.
Cordialement,
Cacophrène
Dernières précisions :
Une fonction définie à l'intérieur d'une autre est une fonction qui va aider la première en factorisant une partie des opérations dans la seconde.
Un exemple typique : les fonctions telles que celles données par SpiceGuid plus haut -> la fonction intérieure va être la fonction récursive and la fonction visible par l'extérieur ne fera que transmettre des informations à la fonction intérieure.
La fonction intérieure est délimitée par le let ... in, comme tu peux le voir dans les divers exemples.
Peut-être que un ou deux exemples bidons t'aideront :
Code caml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 let transform list = let assoc = function | 0 -> 11 | 1 -> 0 | _ -> 10 in List.map assoc list ;; - : val transform : int list -> int list = <fun> transform [1;0;2;1;0;3;1;0;0;0;0;0;1;1;0;1;1;1;1;0];; - : int list = [0; 11; 10; 0; 11; 10; 0; 11; 11; 11; 11; 11; 0; 0; 11; 0; 0; 0; 0; 11]
Merci bien pour votre aide. Une autre question (si vous voulez bien) : comment affiche-t-on un vecteur ? J'aimerais pouvoir, selon une condition, afficher 2 vecteurs, et sinon ne rien faire.
Un vecteur ?
Une liste tu veux dire ?
Un Array ?
ou un type vecteur défini par tes propres soins ?
Ben non, il y a bien un type qui s'appelle vecteur non ? Les listes entre [| |].
Ce sont des arrays :
Sinon, une façon propre d'afficher un array (ce qui s'avère utile que si tu n'es pas dans le toplevel), c'est d'utiliser la fonction iter du module Array de la bibliothèque standard.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [| |];; - : 'a array = [||]
Un exemple avec un int array :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 # let f x = print_int x;; val f : int -> unit = <fun> # let arr = [| 1 ; 2 ; 3 ; 4 ; 5 |];; val arr : int array = [|1; 2; 3; 4; 5|] # Array.iter f arr;; 1 2 3 4 5 - : unit = ()
C'est bizarre quand même, puisque j'utilises des fonctions dont le nom contient "vect".
Lorsque je fais :
let arr = [| 1 ; 2 ; 3 ; 4 ; 5 |];;
j'obtiens :
#arr : int vect = [|1; 2; 3; 4; 5|]
Ah, tu utilises Caml Light ?
Si oui, regarde do_vect ici : http://caml.inria.fr/pub/docs/manual...node14.18.html :
Exemple d'utilisation : changer Array.iter par do_vect dans l'exemple que j'ai donné juste au-dessus.
Désolé de réécrire dans le même sujet, mais j'aimerais savoir comment on ferme l'effet d'une condition :
si [condition] alors [action1] fin
[action2]
Il n'y a rien à indiquer pour ce faire.
A moins que dans ton cas, il s'agisse que d'un if [qqch] then [qqch], auquel cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 let egal_zero x = if x=0 then true else false;; <la suite>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if <condition> then <action> else () <la suite>
Effectivement, ça marche, mais si je mets 2 actions dans le then, il y a un problème (le if ne se ferme pas). Voici mon code :
if palind v (vect_length v) then affiche u ; affiche v ;
print_newline() ;;
Le print_newline() est lu comme étant dans le then.
Suis-je obligé de mettre else () ?
Pourquoi, tu dois payer 10€ à chaque fois que tu mets "else ()" ?
PS : la programmation impérative, il faut la limiter autant que possible.
Ok ok ^^. Bon si j'ai bien compris, va falloir que j'utilise des fonctions. A propos, y-a-t'il une différence pour le compilateur entre définir une fonction à part, puis l'appeler dans une nouvelle fonction ; et définir une fonction là où on a besoin de l'appeler ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager