Monads - Catecbol

Retos en ingeniería del software. ○ Problemas ... Introducido teoreticamente por el matemático Eugenio Moggi. ○ Introducido en ... En matemática: f(g(x)) ...
965KB Größe 13 Downloads 76 vistas
Catecbol

Introducción a los Monads

Catecbol

Introducción a los Monads

Por qué es importante la programación funcional? Erlang

Haskell

Scala

Retos en ingeniería del software Divide et impera



Problemas complejos: dividir



Pequeñas soluciones: composición

Monads ● ● ●

Patrón de diseño funcional Introducido teoreticamente por el matemático Eugenio Moggi Introducido en Haskell en los años 90 por Philip Wadler

Los ejemplos de la presentación en Haskell

Tipos de datos data CiudadBolivia = Cbba | StaCruz | Oruro | LaPaz | Tarija | Beni | Pando | Potosi | Sucre

Tipo de dato Clase en OO

Constructores

Composición de funciones en Haskell convertirAString :: Int -> String convertirAString numero = show numero contarCaracteres :: String -> Int contarCaracteres unaCadena = length unaCadena contarDigitos :: Int -> Int contarDigitos numero = (contarCaracteres . convertirAString) numero

En matemática: f(g(x))

Type classes Similar a interfaces en otros lenguajes de programación Ejemplo: convertir cualquier tipo de dato a cadena (similar a toString) class Show a where show :: a -> String ⇒ Ejemplo

Tipo de dato Maybe data Maybe a = Nothing | Just a Objetivo: Funciones totalmente definidas



Ejemplo en estilo imperativo

public int dividir (int a, int b) { return a / b; }

Tipo de dato Maybe

● Solución funcional Int

dividir :: Int -> Int -> Maybe Int dividir a 0 = Nothing dividir a b = Just ( div a b )

Funciones que retornan Maybe

Maybe Int

Int

Maybe a

a

String -> Maybe Int Int -> Maybe Persona Pregunta: Cómo combinar funciones que retornan Maybe? ⇒ Ejemplo

Función conector

a

-> (a ->

b

) ->

conector :: Maybe a -> (a -> Maybe b) -> Maybe b conector Nothing _ = Nothing conector (Just x) f = f x

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b (>>=) Nothing _ = Nothing (>>=) (Just x) f = f x

b

Función return

a

-> (a ->

b

) ->

b

conector :: Maybe a -> (a -> Maybe b) -> Maybe b Conector requiere algo empaquetado → Solución:función return :: a -> m a

3 convertir en Maybe Int : Just 3

Int

return = Just

Tipo de clase Monad (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b (>>=) Nothing _ = Nothing (>>=) (Just x) f = f x

class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a

Maybe Monad data Maybe a = Nothing | Just a class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a

instance Monad Maybe where Nothing >>= f = Nothing (Just x) >>= f = f x return = Just

Niveles de abstracción ma

a

Maybe a

a

Maybe Int

Int

Monads como contenedores Maybe

2 Just 2

● ● ● ●

List

1

IO

2 [1,2,3]

Maybe es contenedor: Maybe a Listas son contenedores: [a] IO es un contenedor: IO a Otros contenedors….

3

“Hola” IO “Hola”

Escalabilidad de los monads: composición Composición de funciones del tipo : f :: a -> M b (>=>) :: (a -> M b) -> (b -> M c) -> (a -> M c) return :: a -> M a

Aplicabilidad de los monads: composición ● ● ● ● ●

Parsers Programación paralela Programación asíncrona Transacciones en Base de datos Reactive Programming (eventos)

Muchos otros casos

Conclusiones Cada Monad tiene una estrategia de combinación de funciones Maybe Monad: combinar funciones que posiblemente no retornen un resultado List Monad: combinar funciones que retornan uno o varios valores (indeterminismo)

Conclusiones Monads combinan funciones de una forma elegante ● Maybe ● List ● IO ● Funciones en paralelo ● Funciones Async ● Transacciones en Base de datos ● Muchos otros

Conclusiones Esencia de los Monads: composición

Referencias Todo acerca de los monads (All About monads) https://wiki.haskell.org/All_About_Monads

Haskell para todos (Gabriel Gonzales) http://www.haskellforall.com/

Learn you a Haskell for great good. http://learnyouahaskell.com/

Buscador de funciones https://www.haskell.org/hoogle/

Referencias y código Monads para la programación funcional (Philip Wadler) http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf

Notions of computation and monads (Eugenio Moggi) http://www.disi.unige.it/person/MoggiE/ftp/ic91.pdf

Código en github: https://github.com/ovu/monads

Catecbol

Gracias!