joel76 a écrit:Bonjour
Je crois que la syntaxe de Caml est très proche de celle du F#.
En F# j'ai essayé ceci :
- Code: Tout sélectionner
let rec iterer = fun n -> fun f -> fun x ->
match n with
0 -> x
| _-> iterer (n-1) f (f x)
Par exemple pour la fonction :
let fonc (x : int) : int = x * x et l'appel en F#
printfn "%A" ((iterer 3 fonc) 2) j'obtiens
256 !
J'espère que ça correspond en Caml :hum:
J'avais écris comme ça la première fois et j'ai également obtenu cette erreur de type, c'est pour ça que j'ai parenthésé f, en espérant que ça règle le problème , mais en fait non^^
EDIT: problème réglé, en fait dans ma première version j'avais écris let rect...enfin bref ça marche du coup :ptdr:
Par contre, j'en ai deux autres qui me font des caprices, d'une part la fonction ackerman
- Code: Tout sélectionner
let rec ack = fun m -> fun n ->
if(m=0) then n+1
else
if(m>0 && n=0) then ack (n-1) 1
else
if(m>0 && n>0) then [COLOR=Red]ack (m-1) (ack m (n-1))[/COLOR];;
Error: This expression has type int but an expression was expected of type
unit
L'erreur concerne la partie en rouge
D'autre part, j'ai une autre version de itérer qui ne marche pas comme elle le devrait
- Code: Tout sélectionner
let rec itererBis = fun p -> fun f -> fun x ->
if (p x) = true then f x
else itererBis p f (f x);;
val itererBis : ('a -> bool) -> ('a -> 'a) -> 'a -> 'a =
L'idée c'est de faire f(x) tant que le prédicat p n'est pas vérifié.
Par exemple, l'appel suivant
itererBis (fun x -> x x/2) 45;;
devrait retourner 5.
45 22 11 5 retourne 5
Sauf que, mon interpréteur me retourne la valeur 2 :mur: et je ne vois pas ce qui n'est pas bon dans la construction de ma fonction...