Personal tools

Adaugarea unui argument neprocesabil la o functie

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
 
Line 1: Line 1:
  +
[[Category:Ro]]
 
==. 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
Line 50: Line 51:
 
Articol dupa o problema trimisa de Cristian B. (5 feb.2008)
 
Articol dupa o problema trimisa de Cristian B. (5 feb.2008)
 
----
 
----
Pagina in curs de dezvoltare.
+
Pagina indexata la indexul [[Category:Ro]] [http://www.haskell.org/haskellwiki/Category:Ro Categories:Ro]
  +
----
  +
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell. ]<br> <br>
  +
[http://www.haskell.org/haskellwiki/Intrebarile_incepatorului <'''-''' Inapoi la inceputul paginii 'Intrebarile incepatorului Ro/Haskell'. ]

Revision as of 09:29, 5 February 2008

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'.