Currificació

De Viquipèdia
Dreceres ràpides: navegació, cerca

En tecnologies de la informació currificar és una tècnica, inventada per Schönfinkel i Gottlob Frege, i de manera independent per Haskell Curry,[1][2] que consisteix a transformar una funció amb més d'un paràmetre en una composició de funcions que incorporen progressivament, d'un en un, els paràmetres de partida.

Per qualsevol funció de n elements amb dominis D1 a Dn que retorna un valor en el domini Dr:[3]

 f: D1 x D2 x ... x Dn → Dr

hi ha una funció currificada equivalent

curry f: D1 → (D2 → ... →(Dn →Dr))

En altres paraules, curry f: D1 → (D2 → ... →(Dn →Dr)) pren un argument del tipus D1 i retorna una funció del tipus (D2 → ... →(Dn →Dr)). Descurrificar és la transformació inversa.

Intuïtivament, la currificació exposa que "Si configures alguns arguments, tindràs una funció dels arguments restants". Per exemple, si la funció div significa la versió currificada de l'operació x/ i, llavors div amb el paràmetre x ajustat en 1 és una altra funció : igual que la funció inv que torna la inversa multiplicadora dels seus arguments, definida per inv(i) = 1/i.

La motivació pràctica per currificar és que de vegades, les funcions obtingudes en utilitzar alguns, però no tots, els arguments en una funció currificada poden ser útils, per exemple, molts llenguatges tenen una funció o un operador similar a plus_one . Currificar fa fàcil definir aquestes funcions.

Aplicació parcial[modifica | modifica el codi]

A partir d'una funció podem obtenir-ne una altra si n'escapcem el(s) darrer(s) paràmetre(s).

A partir d'una expressió se'n pot obtenir una funció ometent algun dels termes. Per exemple

Referències[modifica | modifica el codi]

  1. Henk Barendregt, Erik Barendsen, "Introduction to Lambda Calculus", març 2000, pàgina 8.
  2. Curry, Haskell. Combinatory logic (en anglès), 1958 [Consulta: 23 octubre 2013]. 
  3. Laurent Dami - More functional reusability in C / C++ / Objective-c with Curried Functions (anglès) Univ. de Ginebra (Suïssa)

Bibliografia[modifica | modifica el codi]

Enllaços externs[modifica | modifica el codi]