stringtranslate.com

Función aplicativa

En programación funcional , un funtor aplicativo , o un aplicativo para abreviar, es una estructura intermedia entre los funtores y las mónadas . En teoría de categorías se denominan funtores monoidales cerrados. Los funtores aplicativos permiten que los cálculos funtoriales se ordenen en secuencia (a diferencia de los funtores simples), pero no permiten utilizar los resultados de los cálculos anteriores en la definición de los posteriores (a diferencia de las mónadas). Los funtores aplicativos son el equivalente en programación de los funtores monoidales laxos con fuerza tensorial en la teoría de categorías .

Los funtores aplicativos fueron introducidos en 2008 por Conor McBride y Ross Paterson en su artículo Programación aplicativa con efectos . [1]

Los funtores aplicativos aparecieron por primera vez como una característica de la biblioteca en Haskell , pero desde entonces se han extendido también a otros lenguajes, incluidos Idris , Agda , OCaml , Scala y F# . Glasgow Haskell, Idris y F# ofrecen características del lenguaje diseñadas para facilitar la programación con funtores aplicativos. En Haskell, los funtores aplicativos se implementan en la Applicativeclase de tipo.

Si bien en lenguajes como Haskell las mónadas son funtores aplicativos, no siempre es así en entornos generales de teoría de categorías: se pueden encontrar ejemplos de mónadas que no son fuertes en Math Overflow.

Definición

En Haskell, un aplicativo es un tipo parametrizado que consideramos como un contenedor para datos del tipo de parámetro más dos métodos purey <*>. El puremétodo para un aplicativo de tipo parametrizado ftiene tipo

puro :: a -> f a     

y puede considerarse como la incorporación de valores al aplicativo. El <*>método para un aplicativo de tipo ftiene tipo

( <*> ) :: f ( a -> b ) -> f a -> f b           

y puede considerarse como el equivalente de la función aplicación dentro del aplicativo. [2]

Como alternativa, en lugar de proporcionar <*>, se puede proporcionar una función llamada liftA2. Estas dos funciones pueden definirse una en términos de la otra; por lo tanto, solo se necesita una para una definición mínimamente completa. [3]

También se requiere que los aplicativos satisfagan cuatro leyes ecuacionales: [3]

Todo aplicativo es un funtor. Para ser explícito, dados los métodos purey <*>, fmapse puede implementar como [3]

fmap g x = g puro <*> x       

La notación comúnmente utilizada es equivalente a .g <$> xpure g <*> x

Ejemplos

En Haskell, el tipo Maybe se puede convertir en una instancia de la clase de tipo Applicativeutilizando la siguiente definición: [2]

instancia Aplicativo Quizás donde -- puro :: a -> Quizás un puro a = Solo un          -- (<*>) :: Tal vez (a -> b) -> Tal vez a -> Tal vez b Nada <*> _ = Nada _ <*> Nada = Nada ( Solo g ) <*> ( Solo x ) = Solo ( g x )                   

Como se indica en la sección Definición, pureconvierte un aen un y aplica una función Maybe a un valor Maybe. El uso del aplicativo Maybe para el tipo permite operar con valores del tipo y el error se maneja automáticamente por la maquinaria aplicativa. Por ejemplo, para sumar y , solo se necesita escribirMaybe a<*>aam :: Maybe Intn :: Maybe Int

( + ) <$> m <*> n    

En el caso en que no hay error, al sumar y se obtiene . Si cualquiera de o es , entonces el resultado también será . Este ejemplo también demuestra cómo los aplicativos permiten una especie de aplicación de función generalizada.m=Just in=Just jJust(i+j)mnNothingNothing

Véase también

Referencias

  1. ^ 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.
  2. ^ ab Hutton, Graham (2016). Programación en Haskell (2.ª ed.). págs. 157–163.
  3. ^ abc "Control.Aplicativo".

Enlaces externos