Retos en ingeniería del software. ○ Problemas ... Introducido teoreticamente por el matemático Eugenio Moggi. ○ Introducido en ... En matemática: f(g(x)) ...
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