Personal tools

Ce inseamna until in Haskell ?

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m
Line 42: Line 42:
 
Exercitiu: Cum aflati care este prima putere a lui 2 mai mare ca 1000 ?
 
Exercitiu: Cum aflati care este prima putere a lui 2 mai mare ca 1000 ?
   
Raspuns: Predicatul este (>1000)
+
Raspuns: Predicatul este (>1000) <br>
Functia: (\x -> 2 * x)
+
Functia: (\x -> 2 * x) <br>
Valoarea: 1
+
Valoarea: 1 <br>
   
 
Incercati deci sa-l calculati cu formula: until (>1000) (\x -> 2 * x) 1
 
Incercati deci sa-l calculati cu formula: until (>1000) (\x -> 2 * x) 1

Revision as of 12:59, 16 December 2007

In limbajul functional Haskell until este bineinteles ... o functie !

Are trei argumente:

- un predicat care spune cand se termina calculele. Tipul sau este a-> Bool
- o functie care are argumentul de acelasi tip cu rezultatul. Adica a-> a
- o valoare de acel tip, cu care sa inceapa calculele. Adica tipul a.

Ce rezultat obtine ? Aplica functia pe argumentul initial si iar o aplica pe rezultat si iar o aplica pe rezultat ... Pina cand ? Conditia de oprire este data de predicat.


Exemplul 1:Calculul factorialului in stilul programarii imperative

Functia until Poate fi folosita pentru a programa in stil imperativ. Aveti insa grija sa transmiteti toate valorile de la o iteratie la alta a "buclei".:)

fac n = result (for init next done)
        where init = (0,1)
              next   (i,m) = (i+1, m * (i+1))
              done   (i,_) = i==n
              result (_,m) = m
 
for i n d = '''until''' d n i

Exemplul 2:Calculul factorialului cu until procesand perechi (n, n!)

Bineinteles perechea initiala este (1,1) iar din cea finala extrage cu snd al doilea element.Pentru oprire il testam pe primul, scos cu fst din pereche.

fac n = snd (until ((>n) . fst) (\(i,m) -> (i+1, i*m)) (1,1))

Exemplul 3: Exercitiu: Cum aflati care este prima putere a lui 2 mai mare ca 1000 ?

Raspuns: Predicatul este (>1000)
Functia: (\x -> 2 * x)
Valoarea: 1

Incercati deci sa-l calculati cu formula: until (>1000) (\x -> 2 * x) 1


Primele doua exemple sunt alese din pagina scrisa de Fritz Ruehr de la Willamette. University. Continutul nu are conditii de distribuire deci l-am considerat de domeniu public. Nu l-am reprodus integral, am ales pentru ilustrarea unei idei doar aceste mici exemple. Originalul este la: <http://www.willamette.edu/~fruehr/haskell/evolution.html>


<= Inapoi la pagina principala Ro/Haskell