Ce inseamna lazy evaluation ?

From HaskellWiki
Revision as of 18:08, 10 April 2011 by Ha$kell (talk | contribs) (→‎. Un caz ne va arata deosebirile)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search


. Doua vorbe despre Pascal sau C

Limbaje cum ar fi Pascal su C sunt limbaje in care se scriu programe formate din atribuiri (si alte structuri de control) si care sunt executate in ordine, sau mai bine zis in ordinea data de instructiunile de control.

Haskell, in contrast cu ele, este un limbaj in care se scriu programe formate din declaratii care se evalueaza flexibil, dupa nevoi, in ordinea decisa de mecanismele de evaluare lenesa = lazy evaluation.

. Un caz ne va arata deosebirile

Sa presupunem ca scriem un spreadsheet / o foaie de calcul / un program de calcul tabelar. Imaginati-va o tabla de sah pe care in loc de piese stau atribuiri care depind unele de altele. Pe vremea cand se lucra in limbajele imperative, C Pascal samd, a programa un spreadsheet era o treaba grea. De exemplu, pe tabla puteau fi urmatoarele calcule de facut:

a1=1
a3=a4+b5
a4=a2+1
a2=b5+2
b5=a1+3

Nici macar un interpretor, de Pascal sau C, sau Basic in ciuda interactivitatii sale nu putea rula asa ceva. Incercati!

Pentru a programa un spreadsheet trebuia sa implementezi niste algoritmi din teoria grafurilor care verificau daca nu erau cicluri in grafuri si calculau valorile in ordinea NECESARA.

Din cauza aceasata un program de calcul tabelar era un software complicat si scump, iar autorul programului LOTUS 1 2 3, un student ca si voi, s-a umplut de bani din vanzarea acestuia.

Ei bine, in Haskell, programul de mai sus este un program perfect valabil, ceea ce inseamna ca este suficient sa parcurgeti matricea spreadsheet-ului si sa print-ati in forma de program Haskell calculele din celulele cu formule.

Haskell include exact mecanismul care lipseste din Basic, Pascal si C, si alege dinamic ordinea in care sa proceseze declaratiile, astfel ca poate calcula totul.

Salvati codul de mai sus intr-un fisier : lazy.hs si apoi:

hugs lazy.hs

Obtineti un program care ruleaza perfect :))

dan@device:~$ hugs lazy.hs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type :? for help
Main> a1
1
Main> a2
6
Main> a3
11
Main> a4
7
Main> b5
4

Este aproape ca si cum am spune ca in Haskell putem lucra cu valori definite in viitor, bineinteles cu conditia ca sa nu se formeze cicluri in graful dependentelor.

Declaratiile pot fi scrise in orice ordine !

Mai programati in Pascal, C sau Java ? Iar daca da, ati inteles acum ce limitari au ?


Dan P 10 aprilie 2011