Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2449 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  prog fonctionnelle (fct d'ordre sup, ocaml)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

prog fonctionnelle (fct d'ordre sup, ocaml)

n°1268738
atmakefka
Posté le 16-12-2005 à 20:04:05  profilanswer
 

Bonjour,  
j´ai vraiment du mal a comprendre ce qu´est une fonction d´ordre superieur..  
quelqu´un pourrait -il m´expliquer ?  
j´apprend le ocaml et ça parle de ça mais j´ai pas vraiment compris...  
par exemple en ocaml je comprends pas ce que fait :  
 
let h = function f -> function y -> (f y) + y  
 
et jai cherché sur google ce qu´etait une fonction d´ordre superieur, j'ai compris la def mais je comprends pas dans le langage  
merci d´avance..

mood
Publicité
Posté le 16-12-2005 à 20:04:05  profilanswer
 

n°1268782
Flaie
No it's necessary
Posté le 16-12-2005 à 21:41:29  profilanswer
 

Là tu déclares h comme une fonction prenant deux paramètres f et y (function f -> function y), et qui renvoie comme résultat y plus le résultat de f appliqué à y.
Comme ça utilise + tu en déduis que y est un entier, donc que la fonction f passé en paramètre à h prends un entier en paramètre (en l'occurence y), et que par conséquent elle renvoie un entier (puisqu'on additionne le résultat à y).
 

Code :
  1. let h = function f -> function y -> (f y) + y;;
  2. (* C'est équivalent à : *)
  3. let h = fun f y -> (f y) + y;;
  4. (* et équivalent à : *)
  5. let h f = function y -> (f y) + y;;
  6. (* et encore équivalent à : *)
  7. let h f y = (f y) + y;; (* les parenthèses autour de f y sont facultatives.. plus haut aussi *)


 
y'a de nombreuses façon d'écrire une fonction en caml, là t'en vois 4 mais elles sont équivalentes, ça dépend de comment tu préfère les écrire, la troisième est sûrement plus claire quand on débute.
 
Pour la définition exacte de fonction d'ordre supérieur, je ne m'en souviens plus, mais ça permet de généraliser sur des fonctions, par exemple en renvoyant comme résultat une fonction (qui peut-être utilisée par la suite (passé en paramètre à une autre fonction par exemple)), ou en prenant une fonction en paramètre, ce qui est le cas ici avec ta fonction h qui prends une fonction f en premier paramètre. Du coup on peut appeler ça une fonction d'ordre supérieure.
 
Par exemple un exemple du style:

Code :
  1. let carre x = x * x;;
  2. let h f y = f y + y;;
  3. h carre;; (* ça te renvoie une fonction qui prends un entier en paramètre et renvoie un entier *)
  4. let carre_de_x_plus_x = function x -> h carre x;;
  5. carre_de_x_plus_x 5;; (* doit renvoyer 5*5 + 5 = 30 *)


---------------
Always wear a camera!
n°1268799
atmakefka
Posté le 16-12-2005 à 23:15:24  profilanswer
 

merci pour votre réponse, j'ai compris :) c'est en gros f(g(y))
par contre je ne comprends pas les formes du genre let h f y = (f y y y) :( ca represente quoi mathématiquement ?
encore merci pour votre aide...


Message édité par atmakefka le 16-12-2005 à 23:36:03
n°1268805
Flaie
No it's necessary
Posté le 16-12-2005 à 23:36:39  profilanswer
 

Pour let h f y = (f y y y);;
C'est tout simplement la fonction h qui prend en paramètre une fonction f et une variable y comme tout à l'heure.
La seule différence c'est que cette fois ci f prends 3 paramètres au lieu d'un seul comme dans l'exemple du dessus.
par exemple :

Code :
  1. let h f y = f y y y;;
  2. let truc x y z = x + y + z;;
  3. h truc 5;; (* renvoie 5 + 5 + 5 = 15 *)


Message édité par Flaie le 16-12-2005 à 23:37:25

---------------
Always wear a camera!
n°1268809
atmakefka
Posté le 16-12-2005 à 23:45:32  profilanswer
 

d'accord merci beaucoup :)

n°1272106
atmakefka
Posté le 22-12-2005 à 22:45:01  profilanswer
 

Bonjour,
que signifie par exemple
val xx : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = <fun>
 
ou
 
val xx : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
 
je ne comprends pas les parenthèses. Je sais que 'a et 'b designe des types généraux mais je ne comprends pas les types calculés
merci pour votre aide


Message édité par atmakefka le 22-12-2005 à 22:47:13
n°1272114
Flaie
No it's necessary
Posté le 22-12-2005 à 23:22:30  profilanswer
 

Alors pour le premier, xx est une fonction qui prends 3 paramètres, le premier est une fonction qui prends deux paramètres, et les deux autres arguments sont les paramètres de la fonction passé en premier à xx .
Les parenthèses pour le premier argument de xx sont là pour bien préciser que c'est une fonction qui est attendue.
Par exemple :

Code :
  1. # let xx f a b = f a b;;
  2. val xx : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = <fun> (* là c'est ta fonction *)
  3. (* on peut imaginer un truc concret avec 'a, 'b, et 'c bien distincts : *)
  4. # let f a b = "a=" ^ (string_of_int a) ^ " et b=" ^ (string_of_float b);;
  5. val f : int -> float -> string = <fun>
  6. # xx f 5 7.5;;
  7. - : string = "a=5 et b=7.5"


 
 
Pour le deuxième : val xx : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>  
xx est donc une fonction qui prends 3 arguments, les deux premiers sont des fonctions (parenthésage).
Voilà ce qu'on peut voir du résultat de l'évaluation de la fonction, xx prends en deuxième paramètre une fonction qui prend du type 'c, et renvoie du type 'a, et le premier paramètre est une fonction qui prend du type 'a (le type de retour de la deuxième fonction) et qui renvoie du type b (c'est le type attendue en résultat de la fonction xx). Et la nourriture pour le deuxième paramètre de xx c'est son 3ème paramètre (type 'c qu'on donne à bouffer au deuxième paramètre qui prends du type 'c).
On peut donc avoir ça :

Code :
  1. # let xx f g x = f (g x);;
  2. val xx : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
  3. # let fonction2 x = float_of_int(x + 1);;
  4. val fonction2 : int -> float = <fun>
  5. # let fonction1 y = "resultat = " ^ (string_of_float y);;
  6. val fonction1 : float -> string = <fun>
  7. # xx fonction1 fonction2 10;; (*devrait renvoyer "resultat = 11." *)
  8. - : string = "resultat = 11."


 
Si t'as d'autres questions ou si tu veux une autre explication, suffit de demander :).


---------------
Always wear a camera!
n°1272117
atmakefka
Posté le 22-12-2005 à 23:23:46  profilanswer
 

Je vous remercie beaucoup :)

n°1272353
atmakefka
Posté le 23-12-2005 à 11:34:25  profilanswer
 

Rebonjour,  
 
une dernière chose : pourriez vous m'expliquer la curryfication ?
 
je comprends la curryfication sur deux parametres mais quand yen a plus..  
en gros cest au lieu de dire let fonction (x,y) =x*y;; par exemple, ont dit que cest à peu pres equivalent à fonction x->(fonction y->x*y);; ou qui s´ecrit simplifié fonction x y = x*y ;;
 
 
ca ça va, mais quand ya plus de parametres... genre  
let fonction f g h i j k= f g h i j k;; ou que je mets des parenthèses aléatoirements  comme let fonction f g h i j k= f (g h) i (j k);; je ne vois plus comment c'est sous forme cartesienne ou le lien

n°1272455
Flaie
No it's necessary
Posté le 23-12-2005 à 12:54:41  profilanswer
 

Bon pour la curryfication si je me souviens bien y'a deux définitions, la première c'est pour quand tu passe les paramètres sous forme d'un n-uplet, la deuxième c'est quand le résultat est une fonction.
 
Donc au lieu d'avoir  

Code :
  1. # let f x y z t = x * (y * z + t);;
  2. val f : int -> int -> int -> int -> int = <fun>
  3. (* tu peux mettre ça sous forme : *)
  4. # let f (x,y,z,t) = x * (y * z + t);;
  5. val f : int * int * int * int -> int = <fun>


C'est à toi de choisir celle qui te plaît le plus, personnellement je préfère la première, mais c'est un choix à faire, dans certains cas ça peut-être plus avantageux de passer un n-uplet plutôt que n paramètres.
 
pour ta fonction :

Code :
  1. let fonction f g h i j k= f g h i j k;;


ça dit que fonction renvoie le même résultat que la fonction f, et que la fonction f prends 5 arguments qui sont g, h, i, j, et k.
Alors que pour :

Code :
  1. let fonction f g h i j k= f (g h) i (j k);;


ça dit que fonction renvoie le même résultat que la fonction f, mais que la fonction f prends 3 arguments, et que g et j sont des fonctions à un argument, si dans ce cas tu enlève le parenthésage, alors l'interpréteur caml ne pourra pas savoir quels sont les 3 paramètres de f, il pourrait prendre g h et i, mais ils n'auraient pas les bon types, et il resterait j et k dont il ne saurais pas quoi faire.


---------------
Always wear a camera!
mood
Publicité
Posté le 23-12-2005 à 12:54:41  profilanswer
 

n°1272486
atmakefka
Posté le 23-12-2005 à 13:44:26  profilanswer
 

d'acc c'est bon, merci

n°1272708
atmakefka
Posté le 23-12-2005 à 19:16:04  profilanswer
 

Bonjour,
Je cherche à calculer la somme de k=0 à n de   (x^(2*k)) /(2*k)!  (il s'agit de la série cosinus hyperbolique).
 
dans la question il etait conseille de définir d'abord une fonction terme de profil float->int->float qui calcul le terme de la somme, j'ai réussi :
 

Code :
  1. # let rec fact n = if n = 0 then 1 else (n*(fact(n-1)));;
  2. let terme x k =  x**(float_of_int(2*k))/.float_of_int (fact(2*k));;
  3. val fact : int -> int = <fun>
  4. # val terme : float -> int -> float = <fun>


 
Mais je ne parviens pas à écrire la fonction récursive serie_cosh de profil float->int->float qui calcule la somme pour les valeurs de n et x passés en paramètre. Je pense qu'il faut utiliser le pattern matching, mais je ne vois pas trop comment faire.En fait je ne sais pas du tout "passer des valeurs en paramètres"
 
Merci d'avance pour votre aide..


Message édité par atmakefka le 23-12-2005 à 19:16:35
n°1272766
Flaie
No it's necessary
Posté le 23-12-2005 à 22:32:50  profilanswer
 

Bonsoir :hello:,
 
Alors je viens de te faire ça, en fait il te manque la fonction qui va itérer sur les k, pour renvoyer le resultat, alors voila comment je viens de te faire ça :
Je ne sais pas si tu as encore vu ce qu'est la recursivité terminale ou non, j'ai fait ça en recursif terminal, donc si tu comprends pas un truc n'hésite pas à demander.
 

Code :
  1. (* la factorielle *)
  2. # let fact n =
  3.   let rec urs n res =
  4.      if n = 0 then 1 * res
  5.      else urs (n-1) (res*n)
  6.   in urs n 1;;
  7. val fact : int -> int = <fun>
  8.  
  9. (* la fonction pour calculer un terme *)
  10. # let terme x k =
  11.   let k' = 2 * k in
  12.      let fac = fact k' in
  13.      (x ** float_of_int k') /. float_of_int(fac);;
  14. val terme : float -> int -> float = <fun>
  15.  
  16. (* 10 en precision, ça suffit *)
  17. # let precision = ref 10;;
  18. val precision : int ref = {contents = 10}
  19.  
  20. (* il ne reste plus qu'a faire la fonction qui itere *)
  21. (* x c'est l'argument du cosh *)
  22. # let iteration x =
  23.   let rec urs x k res =
  24.      if k > !precision then res
  25.      else urs x (k+1) (res +. terme x k)
  26.  in urs x 0 0.;;
  27. val iteration : float -> float = <fun>
  28.  
  29. (* et maintenant on défini mon_cosh x *)
  30. # let mon_cosh x = iteration x;;
  31. val mon_cosh : float -> float = <fun>
  32.  
  33. # cosh 1.;;
  34. - : float = 1.5430806348152437
  35. # mon_cosh 1.;;
  36. - : float = 1.5430806476109531
  37. # cosh 2.;;
  38. - : float = 3.7621956910836314
  39. # mon_cosh 2.;;
  40. - : float = 3.7845488923250858


On a une approximation pas trop mauvaise du coup :o.
Suffit de changer la precision, et logiquement ça devrait s'affiner.
Sinon tu peux toujours te refaire la fonction exponentielle, et puis l'utiliser pour trouver le cosinus hyperbolique :).


---------------
Always wear a camera!
n°1272767
atmakefka
Posté le 23-12-2005 à 22:34:22  profilanswer
 

merci ! :)

n°1272769
atmakefka
Posté le 23-12-2005 à 22:40:43  profilanswer
 

Disons que je ne comprends pas trop pourquoi tu parviens à trouver mon_cosh x en fonction que d'un paramètre, car après j'avais une question calculer la valeur de serie_cosh 0.2 5, donc c'est serie_cosh x n en fonction de deux paramètres. il n'y avait riend 'autre, ils conseillent au debut la fonction terme puis apres la fonction serie_cosh en fonction de x et n passés en parametres. Je n'ai pas vu cette récurrence mais j'ai à peu pres compris ce que t'as fais quand même


Message édité par atmakefka le 23-12-2005 à 22:41:59
n°1272774
Flaie
No it's necessary
Posté le 23-12-2005 à 22:48:52  profilanswer
 

Dans ton exemple serie_cosh 0.2 5;; le 5 c'est la precision que j'ai mis à 10
donc tu peux remplacer par ça :

Code :
  1. # let iteration x n =
  2.  let rec urs x k res =
  3.     if k > n then res (* <----- changé ici *)
  4.     else urs x (k+1) (res +. terme x k)
  5. in urs x 0 0.;;
  6. val iteration : float -> float = <fun>
  7.  
  8. (* et maintenant on défini mon_cosh x *)
  9. # let mon_cosh x n = iteration x n;;
  10. val mon_cosh : float -> int -> float = <fun>
  11.  
  12. (* on test tout ça *)
  13. # mon_cosh 0.2 5;;
  14. - : float = 1.0200667556190759
  15. # cosh 0.2;;
  16. - : float = 1.0200667556190759
  17. (* ça marche bien :) *)


---------------
Always wear a camera!
n°1272775
atmakefka
Posté le 23-12-2005 à 22:50:53  profilanswer
 

merci  :D !

n°1272978
atmakefka
Posté le 24-12-2005 à 17:37:06  profilanswer
 

Bonsoir, besoin d'une petite aide sur les listes:
j'ai un dictionnaire représenté par une liste de couple (mot français, mot anglais)
 
ex : let dico = [("un","one" ); ("chat","cat" )] ;;
 
comment écrire une fonction trad qui à un mot français donné associe le mot anglais correspondant
son profil devra etre  (string*string) list -> string -> string.
 
ex : trad dico "un" renverra "one"
 
j'ai essayé mais bon ça ne marche pas
 

Code :
  1. let trad [("x1","x2" )] "y"= match "y" with
  2.    |"x1"  -> "x2"
  3.    |_     -> "pas dans la liste"
  4.    |"x2"  -> "x1";;


 
merci et bon reveillon :)


Message édité par atmakefka le 24-12-2005 à 17:44:20
n°1272996
Flaie
No it's necessary
Posté le 24-12-2005 à 18:21:26  profilanswer
 

Ben il suffit juste de parcourir la liste dico et voir si le premier élément du couple élément de la liste correspond au mot recherché ou non.
 
Ça doit donner quelque chose comme ça :

Code :
  1. (* la par contre tu as du ('a * string) list -> 'a -> string *)
  2. (* pour avoir du string, tu peux forcer le type avec une concaténation par exemple *)
  3. (* ou alors utiliser String.compare m mot à la place du m = mot plus bas *)
  4. let rec trad dico mot =
  5.   match dico with                 (* on filtre l'élément de la liste qu'on visite *)
  6.   | (m, m')::_ when m = mot -> m' (* c'est le bon mot, on le renvoie *)
  7.   | _::t -> trad t mot            (* c'est pas le bon mot, on va au prochain mot de la liste *)
  8.   | [] -> "pas trouve";;          (* liste parcourue et mot non trouvé *)


 
Bon réveillon à toi aussi.


---------------
Always wear a camera!
n°1272998
atmakefka
Posté le 24-12-2005 à 18:31:45  profilanswer
 

mille merci :)

n°1273107
atmakefka
Posté le 25-12-2005 à 11:20:48  profilanswer
 

Bonjour, une toute derniere chose et j'arrete d'abuser de votre patience...
que font exactement  
 
| (m, m')::_ when m = mot -> m'
| _::t -> trad t mot  
 
?
je sais que les :: servent à ajouter un element dans une liste mais je n'ai pas bien saisi l'action qu'ils ont ici..
encore merci et joyeux noel  :)

n°1273133
Profil sup​primé
Posté le 25-12-2005 à 14:36:15  answer
 

Ils décrivent un motif. Le motif "h::t" représente une liste dont la tête est "h" et la queue est "t". Sachant que "_" permet d'ignorer ce qu'est la tête.
 
Ainsi "(m, m')::_" représente une liste dont la tête est le couple "(m, m')" (ce qui est cohérent puisque tu as une liste de 2-uples).
 
Note que les motifs ne sont pas forcément exclusifs et sont évalués dans l'ordre. Ainsi les deux premier motifs filtrent la même chose (sauf cas particulier que j'aurais raté :D), sauf qu'arrive au deuxième motif on a déjà "filtré" le cas où m = mot.
 
En fait on pourrait écrire :
 


let rec trad dico mot =
  match dico with
    (m, m')::t -> if m = mot then m' else trad t mot
  | [] -> "pas trouvé" ;;

n°1273155
atmakefka
Posté le 25-12-2005 à 16:46:22  profilanswer
 

merci :) !

n°1275429
atmakefka
Posté le 31-12-2005 à 18:55:48  profilanswer
 

bonjour, comment trier une liste de mots dans l'ordre alphabetique?
j'utilise les operateurs >, < et = sur les string mais j'arrive pas a ecrire une fonction correcte :(
merci pour votre aide

n°1275440
Profil sup​primé
Posté le 31-12-2005 à 19:47:19  answer
 

Dans le module String tu as "String.compare" donc tu peux faire :  
 
List.sort String.compare ta_liste ;;

n°1275443
atmakefka
Posté le 31-12-2005 à 19:50:10  profilanswer
 

oki merci :)
mais sinon ya pas une fonction ? j'essaye des trucs depuis quelques heures mais sans succès :(
let rec range liste = match liste with
   t::q -> if t>q then q::t ;;
This expression has type 'a list but is here used with type 'a

n°1275447
Profil sup​primé
Posté le 31-12-2005 à 20:01:10  answer
 

Une fonction pour faire quoi ? Qu'est-ce que tu essaies de faire ?
 
t::q et q::t ne peuvent pas avoir de sens dans la même expression puisque t est de type 'a tandis que q est une liste de 'a. Si tu veux faire un tri bulle il va falloir t'y prendre autrement. :p

n°1275450
atmakefka
Posté le 31-12-2005 à 20:17:27  profilanswer
 

justement mais je n'arrive pas :(
ben par exemple j'ai une liste de mots et je veux les trier dans l'ordre alphabétique, c'est tout

n°1275734
atmakefka
Posté le 02-01-2006 à 09:25:01  profilanswer
 

up svp

n°1276254
atmakefka
Posté le 03-01-2006 à 11:27:53  profilanswer
 

up

n°1276392
souk
Tourist
Posté le 03-01-2006 à 14:31:02  profilanswer
 

let range liste = List.sort String.compare liste ;;
? [:pingouino]

n°1277255
atmakefka
Posté le 04-01-2006 à 22:12:45  profilanswer
 

bonjour,
je dois ecrire une fonction "est_en_vente" de type int->bool qui à un article représenté par son code associe vrai ou faux selon que l'article est ou non dans la liste , dans une liste du type [(code,nom,prix) ; (code2,nom2,prix2) ; (... , ... , ...) ]
 
ca donne
 

let liste_article = [(1,"crayon",5);(2,"stylo", 10)];;
val liste_article : (int * string * int) list = [1, "crayon", 5; 2, "stylo", 10]
 
let rec est_en_vente liste produit = match liste with
    |[] -> false
    |(m, m',m'')::x-> if m = produit then true else est_en_vente x produit;;
    val est_en_vente : ('a * 'b * 'c) list -> 'a -> bool = <fun>


 
je teste :
 

est_en_vente liste_article 1;;
- : bool = true
est_en_vente liste_article 5;;
- : bool = false


 
 
ca marche mais le probleme est le type de ma fonction qui n'est pas int-> bool mais ('a * 'b * 'c) list -> 'a -> bool = <fun> .. :(
 
comment avoir ce type ?

n°1277270
Pillow
'cos the trees won't talk
Posté le 04-01-2006 à 22:36:35  profilanswer
 

La fonction que tu as écrite devrait être une fonction auxilliaire de est_en_vente.
 
exemple un peu différent de ta solution (pour que tu cherches un minimum :o ) :

Code :
  1. let liste_poissons_vivants = ["toto"; "maxime"; "clovis"];;
  2.  
  3. let est_en_vie prenom =
  4.    let rec est_en_vie_aux = function
  5.       h :: t when h=prenom -> true
  6.      | h :: t -> est_en_vie_aux t
  7.      | [] -> false
  8.    in
  9.    est_en_vie_aux liste_poissons_vivants
  10. ;;

(oui c'est un exemple un peu bizarre, je sais [:moule_bite] )
 
PS : si tu ne connais pas : http://www.pps.jussieu.fr/Livres/ora/DA-OCAML/ :o

n°1277271
atmakefka
Posté le 04-01-2006 à 22:39:39  profilanswer
 

merci je vais regarder
oui je connais le site jai même fais l'erreur d'acheter le bouquin alors qu'il est en integralité sur internet..et ya rien de plus dans le bouquin.. :(
 
edit : c'est bon j'ai compris, merci


Message édité par atmakefka le 04-01-2006 à 22:55:13
n°1277308
atmakefka
Posté le 04-01-2006 à 23:05:02  profilanswer
 

par contre comment modifie-t-on en général que certains elements d'une liste et on renvoie la meme modifiée ?
je sais pas, par exemple ajouté 10 aux elements b d'une liste [(x,b);(y,b');(z,b'')]...
je pensais à  
 
 
 


let rec modif liste x= match liste with
   | []->[]
   |(m,m')::t ->[m,m'+x]::modif t x;;
modif liste 5;;
val liste : (int * int) list = [1, 5; 2, 10]
#     val modif : ('a * int) list -> int -> ('a * int) list list = <fun>
# - : (int * int) list list = [[1, 10]; [2, 15]]


 
mais bon le probleme et qu'il y a un "list" de trop dans le type, ca devrait être val modif : ('a * int) list -> int -> ('a * int) list
 
 
merci d'avance pour votre aide.
 
 
edit : c'est bon c'etait juste une histoire de crochet et parenthese lol  :o


Message édité par atmakefka le 04-01-2006 à 23:36:52
n°1277838
atmakefka
Posté le 05-01-2006 à 22:32:13  profilanswer
 

rebonsoir,
je cherche à ecrire une fonction nvelle_heure qui a 2 parametres (x,y) et un retard z fait correspondre une nvelle heure d'arrivée (pour les trains par exemple)
 
on a ainsi nvelle_heure (x,y) z.
 
par exemple, nvelle_heure (10,15) 30 = (11,15) (ca se lit nvelle heure de 10h15 +30 min de retard = 11h15.
 
je dois donc trouver une fonction general pour nimporte quelle heure, mais jarrive pas a gerer les depassements (ya que 60 minutes dans une heure etc, jpeux pas avoir (11,75) par exemple, faut que ce soit (12,15) et cest chiant. jy arrive pour un retard maximum de 60 min, ca donne:
 

let nvelle_heure (x,y) z = if y+z>=60 then (x+1, y+(60-z)) else (x,y+z);;


ce qui se lit si y+z superieur a 60 alors on ecrit (x+1, y+(60-z)), sinon on ecrit (x,y+z) et ca marche bien:
 

# nvelle_heure (10,15) 30;;
- : int * int = 10, 45
 
 
# nvelle_heure (10,15) 60;;
- : int * int = 11, 15


mais pas au dela de 60 min de retard
 

# nvelle_heure (10,15) 70;;
- : int * int = 11, 5


 
Après jai reussi a aller jusque moins de 120 min de retard mais bon..
 

let valabs x = if x>=0 then x else -x;;
 
# let nvelle_heure (x,y) z = if y+z >=60 then (x+1,y+ valabs ((60-z))) else (x,y+z) ;;
nvelle_heure (10,15)70;;
val nvelle_heure : int * int -> int -> int * int = <fun>
# - : int * int = 11, 25
 
 
nvelle_heure (10,15)120;;
# - : int * int = 11, 75


 
 
merci de votre aide...

n°1277922
Pillow
'cos the trees won't talk
Posté le 05-01-2006 à 23:51:49  profilanswer
 

atmakefka a écrit :

par exemple, nvelle_heure (10,15) 30 = (11,15) (ca se lit nvelle heure de 10h15 +30 min de retard = 11h15.

[:ciler]
 

Citation :

je dois donc trouver une fonction general pour nimporte quelle heure, mais jarrive pas a gerer les depassements (ya que 60 minutes dans une heure etc, jpeux pas avoir (11,75) par exemple, faut que ce soit (12,15) et cest chiant.

Il suffit de faire une fonction récursive qui ajoute 1 à la valeur de l'heure et retranche 60 à la valeur des minutes jusqu'à ce que la valeur des minutes soit inférieure à 60.
Pense aussi à gérer correctement minuit (ie. nvelle_heure (23,15) 60 :o )
 
 
(note : il y a la fonction abs qui fait la même chose que ta fonction valabs, pas besoin de réinventer la roue [:dawao] )

n°1277991
atmakefka
Posté le 06-01-2006 à 09:16:45  profilanswer
 

d'accord, merci  :D  je regarderai plus tard  :bounce:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  prog fonctionnelle (fct d'ordre sup, ocaml)

 

Sujets relatifs
Ordre des balises[C et Linux]: Prog port serie
Programmer l'heure d'éxécution d'un ordreutiliser mount() dans un prog execute par lambda
Y a pas un site pour les debutant ( aucune base en prog ) ?Démarrer automatiquement un prog en fonction d'un autre
probleme sur prog, comment enregistrer valeur..Ordre par défaut dans un Select
prog : trouver age helpCode source Galerie photos fonctionnelle
Plus de sujets relatifs à : prog fonctionnelle (fct d'ordre sup, ocaml)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR