En los métodos formales de la informática , un paramorfismo (del griego παρά , que significa "juntos") es una extensión del concepto de catamorfismo introducido por primera vez por Lambert Meertens [1] para tratar con una forma que "se come su argumento y lo conserva también", [2] [3] como lo ejemplifica la función factorial . Su dual categórico es el apomorfismo .
Es una versión más conveniente del catamorfismo ya que brinda a la función de paso de combinación acceso inmediato no solo al valor del resultado calculado recursivamente a partir de cada subobjeto recursivo, sino también al subobjeto original en sí.
Ejemplo de implementación de Haskell, para listas:
cata :: ( a -> b -> b ) -> b -> [ a ] -> b para :: ( a -> ([ a ], b ) -> b ) -> b -> [ a ] -> b ana :: ( b -> ( a , b )) -> b -> [ a ] apo :: ( b -> ( a , Either [ a ] b )) -> b -> [ a ]
cata f b ( a : como ) = f a ( cata f b como ) cata _ b [] = b
para f b ( a : como ) = f a ( como , para f b como ) para _ b [] = b
ana u b = caso u b de ( a , b' ) -> a : ana u b'
apo u b = caso u b de ( a , Derecha b' ) -> a : apo u b' ( a , Izquierda como ) -> a : como
Véase también
- Morfismo
- Morfismos de F-álgebras
- De un álgebra inicial a un álgebra: Catamorfismo
- De una coalgebra a una coalgebra final: Anamorfismo
- Un anamorfismo seguido de un catamorfismo: Hilomorfismo
- Ampliación de la idea de anamorfismos: Apomorfismo
Referencias
- ^ "Paramorfismos" (PDF) . 1990. pág. 44. CiteSeerX 10.1.1.19.4825 .
- ^ Philip Wadler . Vistas: Una forma de que la comparación de patrones conviva con la abstracción de datos. Informe técnico 34, Grupo de metodología de programación, Universidad de Gotemburgo y Universidad Tecnológica de Chalmers, marzo de 1987.
- ^ Meijer, Erik ; Fokkinga, Martín; Paterson, Ross (1991). "Programación funcional con plátanos, lentes, sobres y alambre de púas". CiteSeerX 10.1.1.41.125 .
{{cite web}}: Falta o está vacío|url=( ayuda )
Enlaces externos
- Explicación en StackOverflow: [1], [2], [3]
- Blogs: [4]
- Charlas: [5]
- Esquemas de recursión del paquete Haskell