functional programming - ¿Hay alguna estructura algebraica utilizada en la programación funcional distinta de monoid?
functional-programming algebraic-data-types (3)
Las flechas de Haskell son una generalización de las mónadas y probablemente sean relevantes.
Recientemente me enteré acerca de la programación funcional (en Haskell y Scala). Sus capacidades y elegancia son bastante encantadoras.
Pero cuando conocí a Monads, que hace uso de una estructura algebraica llamada Monoid, me sorprendió y me alegré de ver que el conocimiento teórico que he estado aprendiendo de las Matemáticas se utiliza en la programación.
Esta observación me hizo pensar: ¿Se pueden usar grupos, campos o anillos (ver Estructuras algebraicas para otros) en la programación para obtener más abstracción y reutilización de códigos y lograr una programación matemática similar?
Como sé, el lenguaje llamado Fortress (que seguramente preferiría sobre cualquier idioma una vez cuando se completa su compilador) define esta estructura en su código de biblioteca. Pero solo los usos que vi hasta ahora fueron para tipos numéricos, con los que ya estamos familiarizados. ¿Podría haber otros usos de ellos?
Saludos, ciun
Recomiendo el blog muy legible de Edward Kmett y el paquete de extras de categorías relacionadas. Debería mantenerte ocupado durante años.
Puedes modelar muchas estructuras. Aquí hay un grupo:
class Group a where
mult :: a -> a -> a
identity :: a
inverse :: a -> a
instance Group Integer where
mult = (+)
identity = 0
inverse = negate
-- S_3 (group of all bijections of a 3-element set)
data S3 = ABC | ACB | BAC | BCA | CAB | CBA
instance Group S3 where
mult ABC x = x
... -- some boring code
identity = ABC
inverse ABC = ABC
... -- remaining cases
-- Operations on groups. Dual:
data Dual a = Dual { getDual :: a }
instance Group a => Group (Dual a) where
mult (Dual x) (Dual y) = Dual (mult y x)
identity = Dual identity
inverse (Dual x) = Dual (inverse x)
-- Product:
instance (Group a, Group b) => Group (a,b) where
mult (x,y) (z,t) = (x `mult` z, y `mult` t)
identity = (identity, identity)
inverse (x,y) = (inverse x, inverse y)
Ahora puede escribir mult (Dual CAB, 5) (Dual CBA, 1)
y obtener un resultado. Este será un cálculo en el grupo S 3 * ⨯ Z. Puede agregar otros grupos, combinarlos de cualquier manera posible y hacer cálculos con ellos.
Se pueden hacer cosas similares con anillos, campos, ordenaciones, espacios vectoriales, categorías, etc. La jerarquía numérica de Haskell lamentablemente está mal modelada, pero hay un preludio numérico que intenta arreglar eso. También hay DoCon que lo lleva al extremo. Para un recorrido por las clases de tipos (principalmente motivado por la teoría de categorías), está Typeclassopedia, que tiene una gran lista de ejemplos y aplicaciones.