
fmap (+1)a un árbol binario de enteros, se incrementa en uno cada entero del árbol.En programación funcional , un functor es un patrón de diseño inspirado en la definición de la teoría de categorías que permite aplicar una función a valores dentro de un tipo genérico sin cambiar la estructura de dicho tipo. En Haskell, esta idea se puede plasmar en una clase de tipo :
clase Functor f donde fmap :: ( a -> b ) -> f a -> f bEsta declaración dice que cualquier instancia de Functordebe admitir un método fmap, que mapea una función sobre los elementos de la instancia.
Los functores en Haskell también deben obedecer las llamadas leyes de functores , [ 1 ] que establecen que la operación de mapeo preserva la función identidad y la composición de funciones:
fmap id = id fmap ( g . h ) = ( fmap g ) . ( fmap h )donde .significa composición de funciones .
En Scala, en su lugar, se puede utilizar un rasgo :
rasgo Functor [ F [ _ ]] { def map [ A , B ]( a : F [ A ])( f : A => B ): F [ B ] }Los functores constituyen la base de abstracciones más complejas, como los functores aplicativos , las mónadas y las comónadas , que se construyen sobre una estructura de functor canónico. Los functores son útiles para modelar efectos funcionales mediante valores de tipos de datos parametrizados. Los cálculos modificables se modelan permitiendo que una función pura se aplique a valores del tipo "interno", creando así el nuevo valor global que representa el cálculo modificado (que aún no se ha ejecutado).
Ejemplos
En Haskell, las listas son un ejemplo sencillo de un functor. Podemos implementarlo fmapcomo
fmap f [] = [] fmap f ( x : xs ) = ( f x ) : fmap f xsUn árbol binario puede describirse de forma similar como un functor:
datos Árbol a = Hoja | Nodo a ( Árbol a ) ( Árbol a ) instancia Functor Árbol donde fmap f Hoja = Hoja fmap f ( Nodo x l r ) = Nodo ( f x ) ( fmap f l ) ( fmap f r )Si tenemos un árbol binario y una función , la función se aplicará a cada elemento de . Por ejemplo, si es , sumar 1 a cada elemento de se puede expresar como . [ 2 ]tr :: Tree af :: a -> bfmap f trftraInttrfmap (+ 1) tr
Véase también
- Functor en teoría de categorías
- Funtor aplicativo , un tipo especial de funtor
Referencias
Enlaces externos
- Sección sobre Functor en la Typeclassopedia de Haskell
- Capítulo 11 Funtores, funtores aplicativos y monoides en ¡Aprende Haskell para un gran bien!
- Documentación para Functor en la biblioteca Cats
- Sección sobre Functor en lemastero/scala_typeclassopedia
- Programación funcional
- patrones de diseño de software
- Modismos de programación