# Functor aplicatiu

En programació funcional, un functor aplicatiu, en anglès applicative functor és una estructura algebraica que facilita la combinació de resultats d'una seqüència d'accions d'efectes laterals, sense la serialització temporal que requereixen les mònades, admetent paral·lelisme en la seva execució.
Els Functors Aplicatius van ser introduïts el 2007 per Conor McBride i Ross Paterson en el seu estudi "Funcional Pearl: programació aplicativa amb efectes".
Els functors aplicatius van aparèixer primer com a característica de biblioteca en Haskell, però de llavors ençà s'ha estès a altres llengüatges, incloent Idris, Agda, i Scala. Ambdós Glasgow Haskell i Idris ofereixen característiques del llenguatge per facilitar la programació amb functors aplicatius. En Haskell, és definit a la classe de tipusApplicativedefinida al mòdul Control.Applicative.

## Relació amb les mònades

Per raons històriques, en el llenguatge Haskell, els functors aplicatius no van ser implementats com a superclasse de Mònada, sinó com a classe de tipus separada. Posteriorment la proposta Functor-Applicative-Monad de relació de les respectives classes de tipus va resultar en la incorporació de Applicative com a requeriment per a Monad a la versió 7.10 de GHC.

## Definició

Els Functors aplicatius componen les accions aplicant un resultat combinador de la primera al resultat de l'acció següent. Habitualment s'aplica un combinador amb l' fmap del Functor sobre la primera acció quin resultat serà l'aplicació parcial o no del combinador sobre el resultat de l'acció i que compondrem amb tantes accions com paràmetres manquin a l'aplicació parcial esmentada.

### La classe Applicative (sintaxi Haskell)

Expressa la combinació de computacions (amb efectes col·laterals) sense l'encadenament del resultat i, per tant, la serialització temporal que defineix la mònada. Signatura.
Requereix la classe Functor:
Per aplicar una funció de N arguments als resultats de N computacions en seqüència definides Applicative tenim les funcions liftAn i les expressions equivalents:

#### equivalències amb mètodes de la classe de tipus Mònada o funcions que se'n deriven

En relació amb la mònada tenim les següents equivalències
| Applicative | Monad |
| pure | return |
| (<*>) | ap |
| f_a <* f_b | f_a >>= (\x -> f_b >> return x) -- el cos de la lambda abasta el màxim cap a la dreta !! |

### Execució paral·lela d'efectes laterals amb el Functor aplicatiu Concurrently

A la biblioteca async, facilita l'execució simultània d'operacions I/O no blocants en fils d'execució individuals, on el tipus Concurrently implementa un functor aplicatiu que permet combinar els resultats d'accions engegades asíncronament, esperant-ne la finalització conjunta, i també implementa Alternative per obtenir el resultat de la primera que acaba, anul·lant els fils d'execució de la resta d'operacions engegades.

## L'extensió de Haskell ApplicativeDo

L'extensió de Haskell ApplicativeDo demana al compilador generar codi aplicatiu partint de la sintaxi dels blocs 'do' de les mònades quan sigui possible:

## Referències

* ↑ Journal of Functional Programming. DOI: 10.1017/S0956796807006326. ISSN: 1469-7653.
* ↑ «Functor-Applicative-Monad Proposal - HaskellWiki». wiki.haskell.org. [Consulta: 6 abril 2016].
* 1 2 Control.Applicative(anglès)
* ↑ La classe Functor(anglès)
* ↑ Control-Monad(anglès)
* ↑ Biblioteca Async (anglès)
* ↑ El tipus Concurrently(anglès)
* ↑ La proposta ApplicativeDo(anglès)