Personal tools

Adaugarea unui argument neprocesabil la o functie

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
Line 1: Line 1:
 
[[Category:Ro]]
 
[[Category:Ro]]
  +
  +
  +
Banner pro educational:
  +
<center>
  +
http://www.haskell.org/sitewiki/images/2/2c/BannerProLinuxAndHaskell.gif
  +
  +
La facultate poti invata unul din cele mai productive limbaje: Haskell !
  +
</center>
  +
----
  +
  +
 
==. Problema ==
 
==. Problema ==
 
Doresc sa transform o functie (a->b) intr-o functie (a->c->b) care-si ignora
 
Doresc sa transform o functie (a->b) intr-o functie (a->c->b) care-si ignora

Revision as of 20:40, 18 October 2009


Banner pro educational:

BannerProLinuxAndHaskell.gif

La facultate poti invata unul din cele mai productive limbaje: Haskell !



1 . Problema

Doresc sa transform o functie (a->b) intr-o functie (a->c->b) care-si ignora ultimul argument. Am procedat asa:

h :: (a -> b) -> (a -> c -> b)
h f = \x -> f . (\ y -> x )

Si obtin o transformare h al carei efect se vede in exemplu:
h (\x -> x + 1) 1 "abracadabra"
> 2

2 . Se poate generaliza la mai multe argumente ?

Raspuns: Da, dar ar fi mai simplu sa le scrieti direct cu "where". In urma generalizarii obtineti nu o transformare ci mai multe, cate una pentru fiecare n:

trans1 f = g   where g a1 _ = f a1
 
trans2 f = g   where g a1 a2 _ = f a1 a2
 
trans3 f = g   where g a1 a2 a3  _ = f a1 a2 a3

Se observa imediat ca trans1 este chiiar h iar trans2 si urmatoarele functioneaza asa cum ne asteptam.

Main> h (\x -> x +1) 1 "abracadabra"
2
Main> trans1  (\x -> x +1) 1 "abracadabra"
2

Obs: Forma explicita a acestor functii, asa cum este si forma lui h, este ceva mai greu de citit. Dar intrucat e vorba de transformari de functii care se conformeaza unor ecuatii (iar ecuatiile au o forma particulara care permite implementarea cu where ) nu vad de ce un programator n-ar folosi where in acest caz.

Obs: Si alte biblioteci Haskell (ba si C++) folosesc acest stil de prezentare a unor transformari sub forma unei colectii (vai, finite) de functii numerotate. De exemplu functiile zipn, zipWithn, unzipn si lista ar putea continua. De exemplu cu acele liftM din modulul Monad.

3 . Se poate defini o transformare generala indiferent de numarul de argumente ?

Se poate defini o functie care sa transforme orice functie f :: a1 -> a2 -> ...-> an

in

g :: a1 -> a2 -> ...-> b -> an

similar cu h de mai sus ? Adica sa se respect ecuatia g x1 x2 ... xn-1 y = f x1 x2 ... xn-1 .

Raspuns: Probabil ca nu, sau nu atata vreme cat Haskell atribuie fiecarei entitati cu care lucreaza un tip (si un kind). Ori acele functii transn de mai sus au tipuri diferite. Spun si scriu "probabil" deoarece nu exclud varinta implementarii unor structuri de date pentru reprezentat functiile care ne intereseaza si a unor transformari ale acestor structuri. Dar deja cu acest argument am trecut in alt domeniu, cel al DSL-urilor (mici limbaje specializate) incluse (embeded) in Haskell .


Articol dupa o problema trimisa de Cristian B. (5 feb.2008)


Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la inceputul paginii 'Intrebarile incepatorului Ro/Haskell'.