17

Hace poco conocí la programación funcional (en Haskell y Scala). Sus capacidades y elegancia son bastante encantadoras.¿Hay alguna estructura algebraica utilizada en la programación funcional distinta de monoid?

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 Algebraic Structures 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

+0

Esto no es exactamente lo que estás buscando, pero el artículo * The Typeclassopedia * en [número 13 de The Monad.Reader] (http://www.haskell.org/wikiupload/8/85/TMR- Issue13.pdf) podría ser de interés: es una explicación detallada de varias clases de tipos ('Functor',' Applicative', 'Monoid',' Monad', 'Arrow', etc.) del preludio de Haskell. – stakx

Respuesta

10

Puede modelar muchas estructuras. Aquí está 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 * ⨯ Z. Puede agregar otros grupos, combinarlos de cualquier manera posible y hacer cálculos con ellos.

Se pueden hacer cosas similares con anillos, campos, ordenamientos, espacios vectoriales, categorías, etc. La jerarquía numérica de Haskell lamentablemente está mal modelada, pero hay numeric prelude 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), hay Typeclassopedia que tiene una gran lista de ejemplos y aplicaciones.

3

de Haskell Arrows son una generalización de las mónadas y probablemente son relevantes.

Cuestiones relacionadas