Ce inseamna until in Haskell ?

From HaskellWiki

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>


Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la Intrebarile incepatorului Ro/Haskell.