En la programación funcional , un functor aplicativo , o un aplicativo para abreviar, es una estructura intermedia entre functores y mónadas . Los functores aplicativos permiten secuenciar los cálculos functoriales (a diferencia de los functores simples), pero no permiten usar resultados de cálculos anteriores en la definición de los posteriores (a diferencia de las mónadas). Los functores aplicativos son el equivalente en programación de los functores monoidales laxos con fuerza tensorial en la teoría de categorías .
Los functores aplicativos fueron introducidos en 2008 por Conor McBride y Ross Paterson en su artículo Programación aplicativa con efectos . [1]
Los functores aplicativos aparecieron por primera vez como una función de biblioteca en Haskell , pero desde entonces también se han extendido a otros lenguajes, incluidos Idris , Agda , OCaml , Scala y F # . Tanto Glasgow Haskell como Idris ofrecen ahora funciones de lenguaje diseñadas para facilitar la programación con functores aplicativos. En Haskell, los functores aplicativos se implementan en la Applicative
clase de tipo.
Definición
En Haskell, un aplicativo es un tipo parametrizado que pensamos que es un contenedor de datos de ese tipo más dos métodos pure
y <*>
. Considere un tipo parametrizado f a
. El pure
método para un aplicativo de tipo f
tiene tipo
puro :: a -> f a
y puede pensarse que aporta valores al aplicativo. El <*>
método para un aplicativo de tipo f
tiene tipo
( <*> ) :: f ( a -> b ) -> f a -> f b
y se puede considerar como el equivalente de la aplicación de funciones dentro del aplicativo. [2]
Alternativamente, en lugar de proporcionar <*>
, se puede proporcionar una función llamada liftA2
. Estas dos funciones pueden definirse mutuamente; por lo tanto, solo se necesita uno para una definición mínimamente completa. [3]
Los solicitantes también deben cumplir cuatro leyes de ecuaciones: [3]
- Identidad:
pure id <*> v = v
- Composición:
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
- Homomorfismo:
pure f <*> pure x = pure (f x)
- Intercambio:
u <*> pure y = pure ($ y) <*> u
Todo aplicativo es un funtor. Para ser explícito, dados los métodos pure
y <*>
, fmap
se puede implementar como [3]
fmap f x = puro f <*> x
La notación de uso común es equivalente a .f <$> x
pure f <*> x
Ejemplos de
En Haskell, el tipo Maybe se puede convertir en una instancia de la clase de tipo Applicative
usando la siguiente definición: [2]
instancia Aplicativo Quizás donde - puro :: a -> Quizás un puro a = Solo un - (<*>) :: Quizás (a -> b) -> Quizás a -> Quizás b Nada <*> _ = Nada _ <*> Nada = Nada ( Solo g ) <*> ( Solo x ) = Solo ( g x )
Como se indica en la sección Definición, pure
convierte an a
en a , y aplica una función Quizás a un valor Quizás. El uso del aplicativo Maybe para tipo permite operar con valores de tipo y el error es manejado automáticamente por la maquinaria aplicativa. Por ejemplo, para agregar 1 a , solo se necesita escribirMaybe a
<*>
a
a
n :: Maybe Int
( + 1 ) <$> n
Si , entonces el resultado será , y si , entonces el resultado será . Este ejemplo también demuestra cómo los aplicativos permiten una especie de aplicación de función generalizada.n = Nothing
Nothing
n = Just k
Just (k+1)
Ver también
Referencias
- ^ McBride, Conor; Paterson, Ross (1 de enero de 2008). "Programación aplicativa con efectos". Revista de programación funcional . 18 (1): 1–13. CiteSeerX 10.1.1.114.1555 . doi : 10.1017 / S0956796807006326 . ISSN 1469-7653 .
- ^ a b Hutton, Graham (2016). Programación en Haskell (2 ed.). págs. 157-163.
- ^ a b c "Control.Aplicativo" .