SlideShare ist ein Scribd-Unternehmen logo
1 von 74
Downloaden Sie, um offline zu lesen
Programación
Funcional en Haskell
Agustín Ramos Fonseca

#sgvirtual

Wednesday, October 23, 13
¿Qué es Haskell?

Wednesday, October 23, 13
Wednesday, October 23, 13
Un lenguaje de programación...

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.
Las funciones no tienen efectos colaterales.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.
Las funciones no tienen efectos colaterales.

• De evaluación perezosa.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.
Las funciones no tienen efectos colaterales.

• De evaluación perezosa.
Las expresiones se evalúan hasta que es requerido.

Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.
Las funciones no tienen efectos colaterales.

• De evaluación perezosa.
Las expresiones se evalúan hasta que es requerido.

• De tipado estático.
Wednesday, October 23, 13
Un lenguaje de programación...

• Funcional.
Las funciones son construcciones de primera clase.

• Puro.
Las funciones no tienen efectos colaterales.

• De evaluación perezosa.
Las expresiones se evalúan hasta que es requerido.

• De tipado estático.
Con inferencia de tipos.
Wednesday, October 23, 13
Un poco de Historia

Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

Wednesday, October 23, 13

ML y
Hope

1970’s
Un poco de Historia

LISP
(John McCarthy)

1958

Wednesday, October 23, 13

ML y
Hope

1970’s

1985
Un poco de Historia

LISP
(John McCarthy)

1958

ML y
Hope

1970’s

1985
FPCA '87

Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

ML y
Hope

1970’s

1985
FPCA '87

¡Necesitamos Haskell!
Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

ML y
Hope

1970’s

Haskell 1.0

1985

1990

FPCA '87

¡Necesitamos Haskell!
Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

ML y
Hope

Haskell 1.0

Haskell ’98

1970’s

1985

1990

1998

FPCA '87

¡Necesitamos Haskell!
Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

Haskell ’98
Revised Report

ML y
Hope

Haskell 1.0

Haskell ’98

1970’s

1985

1990

1998 2003

FPCA '87

¡Necesitamos Haskell!
Wednesday, October 23, 13
Un poco de Historia

LISP
(John McCarthy)

1958

Haskell ’98
Revised Report

ML y
Hope

Haskell 1.0

Haskell ’98

1970’s

1985

1990

1998 2003

Haskell 2010

2010

FPCA '87

¡Necesitamos Haskell!
Wednesday, October 23, 13
Motivación de los Sistemas de
Tipado Estático
import foo
def bar(baz, quux):
x = baz.do_something()
y = quux.do_something_else()
return x + y

Wednesday, October 23, 13
Motivación de los Sistemas de
Tipado Estático
# Los imports pueden tener efectos colaterales,
# como escribir en un archivo... o lanzar un misil.
import foo
def bar(baz, quux):
# baz puede ser cualquier objeto
# y podría no tener el método do_something()
x = baz.do_something()
# quux puede ser cualquier objeto y podría
# no ser capaz de ejecutaro do_something_else()
y = quux.do_something_else()
# El operador ‘+’ podría estar sobrecargado y
# hacer algo impredecible o simplemente fallar.
return x + y

Wednesday, October 23, 13
Características
•
•
•
•
•
•
•
•
•

List comprehensions.
Pattern matching.
Currying
Composición de funciones.
Infinite data structures.
Agebraic Data Types
Type classes.
Applicative Functors
Monads

Wednesday, October 23, 13
Ejemplos

Wednesday, October 23, 13
Tipos
Prelude > :t 2
2 :: Num a => a
Prelude > :t [1,2,3]
[1,2,3] :: Num t => [t]
Prelude > :t ["hola","mundo"]
["hola","mundo"] :: [[Char]]
Prelude > :t head
head :: [a] -> a
Prelude > :t [even,odd]
[even,odd] :: Integral a => [a -> Bool]

Wednesday, October 23, 13
Listas
Lista de Num
[1,2,3,4,5]
Lista (rango) de Char
[‘a’..’z’]
Lista de strings [Char]
[“hola”,”mundo”]

Wednesday, October 23, 13
Funciones sobre listas (1/2)
Prelude > head [1,2,3,4,5]
1
Prelude > tail [1..5]
[2,3,4,5]
Prelude > [1..5] !! 3
4
Prelude > take 2 [1..5]
[1,2]
Prelude > filter even [1..5]
[2,4]

Wednesday, October 23, 13
Funciones sobre listas (2/2)
Prelude > map (x -> x*x) [1..5]
[1,4,9,16,25]
Prelude > zip [1..5] ['a'..'e']
[(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]
Prelude > zipWith (x y -> x + y) [1..5] [11..15]
[12,14,16,18,20]
Prelude > zipWith (+) [1..5] [11..15]
[12,14,16,18,20]
Prelude > foldl (+) 0 [1..5]
15

Wednesday, October 23, 13
Funciones
Area de un círculo
circleArea r = pi * r^ 0
Secuencia de Fibonacci
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

Wednesday, October 23, 13
Funciones
QuickSort
quicksort :: Ord a => [a] -> [a]
quicksort []
= []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs

Wednesday, October 23, 13
Funciones
Prelude
3
Prelude
3
Prelude
6
Prelude
2
Prelude
2
Prelude
True
Prelude
True

>1+2
> (+) 1 2
> (*) 2 3
> div 10 5
> 10 `div` 5
> ($) even 4
> even $ 4

Wednesday, October 23, 13
List comprehensions
Prelude > [ x | x <- [1..10] , even x ]
[2,4,6,8,10]
Prelude > [ (x,y) | x <- [1..5], y <- [1..5] , even x, odd y ]
[(2,1),(2,3),(2,5),(4,1),(4,3),(4,5)]
Prelude > map ($3) $ map (*) [1..10] -- La “tabla” del 3
[3,6,9,12,15,18,21,24,27,30]
Prelude > [ map ($x) $ map (*) [1..10] | x <-[2..9] ] --Las “tablas” del 2 al 9
[[2,4,6,8,10,12,14,16,18,20],[3,6,9,12,15,18,21,24,27,30],[4,8,12,16,20,24,28,32,36,40],
[5,10,15,20,25,30,35,40,45,50],[6,12,18,24,30,36,42,48,54,60],
[7,14,21,28,35,42,49,56,63,70],[8,16,24,32,40,48,56,64,72,80],
[9,18,27,36,45,54,63,72,81,90]]

Wednesday, October 23, 13
Pattern Matching
Prelude >
Prelude >
1
Prelude >
[2,3,4,5]
Prelude >
Prelude >
2
Prelude >
Prelude >
5
Prelude >
Prelude >
“hola”

let (x:xs) = [1..5]
x
xs
let (x:y:xs) = [1..5]
y
let Just x = Just 5
x
let (a,b,c) = (3,"hola",[1,2,3])
b

Wednesday, October 23, 13
Currying
Prelude > let sum x y z = x + y + z
Prelude > sum3 1 2 3
6
Prelude > :t sum
sum :: Num a => a -> a -> a -> a
Prelude > :t sum 1
sum 1 :: Num a => a -> a -> a
Prelude > :t sum 1 2
sum 1 2 :: Num a => a -> a
Prelude > let sum2and3 = sum 2 3
Prelude > sum2and3 5
10
Prelude > sum 2 4 $ 5
11

Wednesday, October 23, 13
Composición de Funciones
Prelude > let foo = (*2).(+5)
Prelude > :t foo
foo :: Integer -> Integer
Prelude > foo 4
18
Prelude >
Prelude >
Prelude > let strToUpper = map toUpper
Prelude > let strToLower = map toLower
Prelude > map ($ "WaZoWzky") $ map ((reverse).) [strToUpper, strToLower]
["YKZWOZAW","ykzwozaw"]

Wednesday, October 23, 13
Evaluación Perezosa
Ejemplo: El triángulo de Pascal

Wednesday, October 23, 13
Algebraic Data Types

Prelude > data Toy = Buzz | Woody | Rex | Hamm deriving (Eq, Ord, Show)
Prelude > let x = Rex
Prelude > x
Rex
Prelude > data Maybe a = Nothing | Just a
Prelude > :t Just 5
Just 5 :: Num a => Maybe a

Wednesday, October 23, 13
Algebraic Data Types
type Radius = Float
type Side = Float
type Vertex = (Float, Float)
data Shape = Rectangle Side Side |
! ! !
Ellipse Radius Radius |
! ! !
RtTriangle Side Side |
Polygon [Vertex]
deriving Show

Wednesday, October 23, 13
Algebraic Data Types
data Car = Car { company :: String  
               , model :: String  
               , year :: Int  
               } deriving (Show)
Prelude > let stang = Car {company="Ford", model="Mustang", year=1967}
Prelude > company stang
"Ford"
Prelude > year stang
1967

Wednesday, October 23, 13
Evaluación Perezosa

Solución:
pascal n = take n $
iterate (r -> zipWith (+) ([0] ++ r) (r ++ [0])) [1]

Wednesday, October 23, 13
¿Por qué aprender
Haskell?

Wednesday, October 23, 13
¿Por qué aprender Haskell?
"My personal reason for using Haskell is that I
have found that I write more bug-free code in
less time using Haskell than any other language.
I also find it very readable and extensible."
- Hal Daumé III

Wednesday, October 23, 13
¿Por qué aprender Haskell?
"Learning Haskell may not get you a job
programming in Haskell, but as Paul Graham
postulates, it may still get you a job. Personally, I
find that irrelevant. Learning the language has
proven to be fun and rewarding and I plan to
continue my Haskell adventures into 2012”
- Sean Voisen

Wednesday, October 23, 13
¿Por qué aprender Haskell?

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Incorpora conceptos de programación de un nivel
de abstracción superior a los existentes en otros
lenguajes.

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Incorpora conceptos de programación de un nivel
de abstracción superior a los existentes en otros
lenguajes.
Mayor abstracción => Mayor poder

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Incorpora conceptos de programación de un nivel
de abstracción superior a los existentes en otros
lenguajes.
Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos,
son aplicables a otros lenguajes y tecnologías.

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Incorpora conceptos de programación de un nivel
de abstracción superior a los existentes en otros
lenguajes.
Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos,
son aplicables a otros lenguajes y tecnologías.
Te convierte en mejor programador

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Incorpora conceptos de programación de un nivel
de abstracción superior a los existentes en otros
lenguajes.
Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos,
son aplicables a otros lenguajes y tecnologías.
Te convierte en mejor programador

• Es una plataforma madura para el desarrollo de
aplicaciones en el mundo real.

Wednesday, October 23, 13
¿Por qué aprender Haskell?

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Presenciar la evolución de un lenguaje/plataforma
ya madura y estable, pero con un ritmo de
crecimiento muy interesante.

Wednesday, October 23, 13
¿Por qué aprender Haskell?

• Presenciar la evolución de un lenguaje/plataforma
ya madura y estable, pero con un ritmo de
crecimiento muy interesante.

• La comunidad es muy dinámica y presta ayuda.

Wednesday, October 23, 13
Porque...

Wednesday, October 23, 13

#SoyPunk
Para saber más... (1/3)

Wednesday, October 23, 13
Para saber más... (1/3)

Wednesday, October 23, 13
Para saber más... (1/3)

Wednesday, October 23, 13
Para saber más... (2/3)

Wednesday, October 23, 13
Para saber más... (3/3)

• http://tryhaskell.org/
Tutorial interactivo en línea

• http://www.haskell.org
Sitio oficial de Haskell

• http://j.mp/1cMCJr5
Yet Another Haskell Tutorial

Wednesday, October 23, 13
Para saber más...

Wednesday, October 23, 13
Para saber más...

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx
Reunión quincenal para practicar Haskell

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx
Reunión quincenal para practicar Haskell
y platicar sobre Programación Funcional

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx
Reunión quincenal para practicar Haskell
y platicar sobre Programación Funcional

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx
Reunión quincenal para practicar Haskell
y platicar sobre Programación Funcional

Wednesday, October 23, 13
Para saber más...
@Lambda_Mx
Grupo de Interés en Programación Funcional
en México, D.F.
#HaskellDojoMx
Reunión quincenal para practicar Haskell
y platicar sobre Programación Funcional

Wednesday, October 23, 13
¿Preguntas?

Wednesday, October 23, 13
¡Gracias!

Agustín Ramos Fonseca
@MachinesAreUs
Wednesday, October 23, 13

Weitere ähnliche Inhalte

Andere mochten auch

I1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellI1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellJosé A. Alonso
 
Programación funcional
Programación funcionalProgramación funcional
Programación funcionalDamián Rotta
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskellAgustin Ramos
 
Haskell wikipedia
Haskell wikipediaHaskell wikipedia
Haskell wikipediaHofexfoq
 
Tipos de memoria.
Tipos de memoria.Tipos de memoria.
Tipos de memoria.camilo199
 
Original Curry
Original CurryOriginal Curry
Original CurryPATISELE
 
Tipos De Datos Lisp
Tipos De Datos LispTipos De Datos Lisp
Tipos De Datos Lispyamies
 
Tipos de lenguaje de programacion part 1
Tipos de lenguaje de programacion part 1Tipos de lenguaje de programacion part 1
Tipos de lenguaje de programacion part 1Ernes 28
 
Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.José A. Alonso
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellJosé A. Alonso
 
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...carolina peña
 
Programación estructurada presentación
Programación estructurada presentaciónProgramación estructurada presentación
Programación estructurada presentaciónIvarra
 
Importancia De La ProgramacióN Estructurada
Importancia De La ProgramacióN EstructuradaImportancia De La ProgramacióN Estructurada
Importancia De La ProgramacióN EstructuradaMarvin Romero
 
Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell José A. Alonso
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONALFredy Olaya
 

Andere mochten auch (20)

I1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellI1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en Haskell
 
Intro haskell
Intro haskellIntro haskell
Intro haskell
 
Haskell
HaskellHaskell
Haskell
 
Programación funcional
Programación funcionalProgramación funcional
Programación funcional
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
 
Yesod Framework
Yesod FrameworkYesod Framework
Yesod Framework
 
Haskell wikipedia
Haskell wikipediaHaskell wikipedia
Haskell wikipedia
 
Tipos de memoria.
Tipos de memoria.Tipos de memoria.
Tipos de memoria.
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 
Original Curry
Original CurryOriginal Curry
Original Curry
 
Tipos De Datos Lisp
Tipos De Datos LispTipos De Datos Lisp
Tipos De Datos Lisp
 
Tipos de lenguaje de programacion part 1
Tipos de lenguaje de programacion part 1Tipos de lenguaje de programacion part 1
Tipos de lenguaje de programacion part 1
 
Tipos de programacion
Tipos de programacionTipos de programacion
Tipos de programacion
 
Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en Haskell
 
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
 
Programación estructurada presentación
Programación estructurada presentaciónProgramación estructurada presentación
Programación estructurada presentación
 
Importancia De La ProgramacióN Estructurada
Importancia De La ProgramacióN EstructuradaImportancia De La ProgramacióN Estructurada
Importancia De La ProgramacióN Estructurada
 
Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONAL
 

Mehr von Software Guru

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasSoftware Guru
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesSoftware Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environmentsSoftware Guru
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorSoftware Guru
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealSoftware Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowSoftware Guru
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:Software Guru
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learningSoftware Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDiSoftware Guru
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Software Guru
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSSoftware Guru
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...Software Guru
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?Software Guru
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Software Guru
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsSoftware Guru
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosSoftware Guru
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressSoftware Guru
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsSoftware Guru
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Software Guru
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoSoftware Guru
 

Mehr von Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Kürzlich hochgeladen

Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosJhonJairoRodriguezCe
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 

Kürzlich hochgeladen (11)

Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 

Programación funcional con haskell

  • 1. Programación Funcional en Haskell Agustín Ramos Fonseca #sgvirtual Wednesday, October 23, 13
  • 4. Un lenguaje de programación... Wednesday, October 23, 13
  • 5. Un lenguaje de programación... • Funcional. Wednesday, October 23, 13
  • 6. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. Wednesday, October 23, 13
  • 7. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Wednesday, October 23, 13
  • 8. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Las funciones no tienen efectos colaterales. Wednesday, October 23, 13
  • 9. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Las funciones no tienen efectos colaterales. • De evaluación perezosa. Wednesday, October 23, 13
  • 10. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Las funciones no tienen efectos colaterales. • De evaluación perezosa. Las expresiones se evalúan hasta que es requerido. Wednesday, October 23, 13
  • 11. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Las funciones no tienen efectos colaterales. • De evaluación perezosa. Las expresiones se evalúan hasta que es requerido. • De tipado estático. Wednesday, October 23, 13
  • 12. Un lenguaje de programación... • Funcional. Las funciones son construcciones de primera clase. • Puro. Las funciones no tienen efectos colaterales. • De evaluación perezosa. Las expresiones se evalúan hasta que es requerido. • De tipado estático. Con inferencia de tipos. Wednesday, October 23, 13
  • 13. Un poco de Historia Wednesday, October 23, 13
  • 14. Un poco de Historia LISP (John McCarthy) 1958 Wednesday, October 23, 13
  • 15. Un poco de Historia LISP (John McCarthy) 1958 Wednesday, October 23, 13 ML y Hope 1970’s
  • 16. Un poco de Historia LISP (John McCarthy) 1958 Wednesday, October 23, 13 ML y Hope 1970’s 1985
  • 17. Un poco de Historia LISP (John McCarthy) 1958 ML y Hope 1970’s 1985 FPCA '87 Wednesday, October 23, 13
  • 18. Un poco de Historia LISP (John McCarthy) 1958 ML y Hope 1970’s 1985 FPCA '87 ¡Necesitamos Haskell! Wednesday, October 23, 13
  • 19. Un poco de Historia LISP (John McCarthy) 1958 ML y Hope 1970’s Haskell 1.0 1985 1990 FPCA '87 ¡Necesitamos Haskell! Wednesday, October 23, 13
  • 20. Un poco de Historia LISP (John McCarthy) 1958 ML y Hope Haskell 1.0 Haskell ’98 1970’s 1985 1990 1998 FPCA '87 ¡Necesitamos Haskell! Wednesday, October 23, 13
  • 21. Un poco de Historia LISP (John McCarthy) 1958 Haskell ’98 Revised Report ML y Hope Haskell 1.0 Haskell ’98 1970’s 1985 1990 1998 2003 FPCA '87 ¡Necesitamos Haskell! Wednesday, October 23, 13
  • 22. Un poco de Historia LISP (John McCarthy) 1958 Haskell ’98 Revised Report ML y Hope Haskell 1.0 Haskell ’98 1970’s 1985 1990 1998 2003 Haskell 2010 2010 FPCA '87 ¡Necesitamos Haskell! Wednesday, October 23, 13
  • 23. Motivación de los Sistemas de Tipado Estático import foo def bar(baz, quux): x = baz.do_something() y = quux.do_something_else() return x + y Wednesday, October 23, 13
  • 24. Motivación de los Sistemas de Tipado Estático # Los imports pueden tener efectos colaterales, # como escribir en un archivo... o lanzar un misil. import foo def bar(baz, quux): # baz puede ser cualquier objeto # y podría no tener el método do_something() x = baz.do_something() # quux puede ser cualquier objeto y podría # no ser capaz de ejecutaro do_something_else() y = quux.do_something_else() # El operador ‘+’ podría estar sobrecargado y # hacer algo impredecible o simplemente fallar. return x + y Wednesday, October 23, 13
  • 25. Características • • • • • • • • • List comprehensions. Pattern matching. Currying Composición de funciones. Infinite data structures. Agebraic Data Types Type classes. Applicative Functors Monads Wednesday, October 23, 13
  • 27. Tipos Prelude > :t 2 2 :: Num a => a Prelude > :t [1,2,3] [1,2,3] :: Num t => [t] Prelude > :t ["hola","mundo"] ["hola","mundo"] :: [[Char]] Prelude > :t head head :: [a] -> a Prelude > :t [even,odd] [even,odd] :: Integral a => [a -> Bool] Wednesday, October 23, 13
  • 28. Listas Lista de Num [1,2,3,4,5] Lista (rango) de Char [‘a’..’z’] Lista de strings [Char] [“hola”,”mundo”] Wednesday, October 23, 13
  • 29. Funciones sobre listas (1/2) Prelude > head [1,2,3,4,5] 1 Prelude > tail [1..5] [2,3,4,5] Prelude > [1..5] !! 3 4 Prelude > take 2 [1..5] [1,2] Prelude > filter even [1..5] [2,4] Wednesday, October 23, 13
  • 30. Funciones sobre listas (2/2) Prelude > map (x -> x*x) [1..5] [1,4,9,16,25] Prelude > zip [1..5] ['a'..'e'] [(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')] Prelude > zipWith (x y -> x + y) [1..5] [11..15] [12,14,16,18,20] Prelude > zipWith (+) [1..5] [11..15] [12,14,16,18,20] Prelude > foldl (+) 0 [1..5] 15 Wednesday, October 23, 13
  • 31. Funciones Area de un círculo circleArea r = pi * r^ 0 Secuencia de Fibonacci fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) Wednesday, October 23, 13
  • 32. Funciones QuickSort quicksort :: Ord a => [a] -> [a] quicksort [] = [] quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) where lesser = filter (< p) xs greater = filter (>= p) xs Wednesday, October 23, 13
  • 33. Funciones Prelude 3 Prelude 3 Prelude 6 Prelude 2 Prelude 2 Prelude True Prelude True >1+2 > (+) 1 2 > (*) 2 3 > div 10 5 > 10 `div` 5 > ($) even 4 > even $ 4 Wednesday, October 23, 13
  • 34. List comprehensions Prelude > [ x | x <- [1..10] , even x ] [2,4,6,8,10] Prelude > [ (x,y) | x <- [1..5], y <- [1..5] , even x, odd y ] [(2,1),(2,3),(2,5),(4,1),(4,3),(4,5)] Prelude > map ($3) $ map (*) [1..10] -- La “tabla” del 3 [3,6,9,12,15,18,21,24,27,30] Prelude > [ map ($x) $ map (*) [1..10] | x <-[2..9] ] --Las “tablas” del 2 al 9 [[2,4,6,8,10,12,14,16,18,20],[3,6,9,12,15,18,21,24,27,30],[4,8,12,16,20,24,28,32,36,40], [5,10,15,20,25,30,35,40,45,50],[6,12,18,24,30,36,42,48,54,60], [7,14,21,28,35,42,49,56,63,70],[8,16,24,32,40,48,56,64,72,80], [9,18,27,36,45,54,63,72,81,90]] Wednesday, October 23, 13
  • 35. Pattern Matching Prelude > Prelude > 1 Prelude > [2,3,4,5] Prelude > Prelude > 2 Prelude > Prelude > 5 Prelude > Prelude > “hola” let (x:xs) = [1..5] x xs let (x:y:xs) = [1..5] y let Just x = Just 5 x let (a,b,c) = (3,"hola",[1,2,3]) b Wednesday, October 23, 13
  • 36. Currying Prelude > let sum x y z = x + y + z Prelude > sum3 1 2 3 6 Prelude > :t sum sum :: Num a => a -> a -> a -> a Prelude > :t sum 1 sum 1 :: Num a => a -> a -> a Prelude > :t sum 1 2 sum 1 2 :: Num a => a -> a Prelude > let sum2and3 = sum 2 3 Prelude > sum2and3 5 10 Prelude > sum 2 4 $ 5 11 Wednesday, October 23, 13
  • 37. Composición de Funciones Prelude > let foo = (*2).(+5) Prelude > :t foo foo :: Integer -> Integer Prelude > foo 4 18 Prelude > Prelude > Prelude > let strToUpper = map toUpper Prelude > let strToLower = map toLower Prelude > map ($ "WaZoWzky") $ map ((reverse).) [strToUpper, strToLower] ["YKZWOZAW","ykzwozaw"] Wednesday, October 23, 13
  • 38. Evaluación Perezosa Ejemplo: El triángulo de Pascal Wednesday, October 23, 13
  • 39. Algebraic Data Types Prelude > data Toy = Buzz | Woody | Rex | Hamm deriving (Eq, Ord, Show) Prelude > let x = Rex Prelude > x Rex Prelude > data Maybe a = Nothing | Just a Prelude > :t Just 5 Just 5 :: Num a => Maybe a Wednesday, October 23, 13
  • 40. Algebraic Data Types type Radius = Float type Side = Float type Vertex = (Float, Float) data Shape = Rectangle Side Side | ! ! ! Ellipse Radius Radius | ! ! ! RtTriangle Side Side | Polygon [Vertex] deriving Show Wednesday, October 23, 13
  • 42. Evaluación Perezosa Solución: pascal n = take n $ iterate (r -> zipWith (+) ([0] ++ r) (r ++ [0])) [1] Wednesday, October 23, 13
  • 44. ¿Por qué aprender Haskell? "My personal reason for using Haskell is that I have found that I write more bug-free code in less time using Haskell than any other language. I also find it very readable and extensible." - Hal Daumé III Wednesday, October 23, 13
  • 45. ¿Por qué aprender Haskell? "Learning Haskell may not get you a job programming in Haskell, but as Paul Graham postulates, it may still get you a job. Personally, I find that irrelevant. Learning the language has proven to be fun and rewarding and I plan to continue my Haskell adventures into 2012” - Sean Voisen Wednesday, October 23, 13
  • 46. ¿Por qué aprender Haskell? Wednesday, October 23, 13
  • 47. ¿Por qué aprender Haskell? • Incorpora conceptos de programación de un nivel de abstracción superior a los existentes en otros lenguajes. Wednesday, October 23, 13
  • 48. ¿Por qué aprender Haskell? • Incorpora conceptos de programación de un nivel de abstracción superior a los existentes en otros lenguajes. Mayor abstracción => Mayor poder Wednesday, October 23, 13
  • 49. ¿Por qué aprender Haskell? • Incorpora conceptos de programación de un nivel de abstracción superior a los existentes en otros lenguajes. Mayor abstracción => Mayor poder • Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías. Wednesday, October 23, 13
  • 50. ¿Por qué aprender Haskell? • Incorpora conceptos de programación de un nivel de abstracción superior a los existentes en otros lenguajes. Mayor abstracción => Mayor poder • Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías. Te convierte en mejor programador Wednesday, October 23, 13
  • 51. ¿Por qué aprender Haskell? • Incorpora conceptos de programación de un nivel de abstracción superior a los existentes en otros lenguajes. Mayor abstracción => Mayor poder • Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías. Te convierte en mejor programador • Es una plataforma madura para el desarrollo de aplicaciones en el mundo real. Wednesday, October 23, 13
  • 52. ¿Por qué aprender Haskell? Wednesday, October 23, 13
  • 53. ¿Por qué aprender Haskell? • Presenciar la evolución de un lenguaje/plataforma ya madura y estable, pero con un ritmo de crecimiento muy interesante. Wednesday, October 23, 13
  • 54. ¿Por qué aprender Haskell? • Presenciar la evolución de un lenguaje/plataforma ya madura y estable, pero con un ritmo de crecimiento muy interesante. • La comunidad es muy dinámica y presta ayuda. Wednesday, October 23, 13
  • 56. Para saber más... (1/3) Wednesday, October 23, 13
  • 57. Para saber más... (1/3) Wednesday, October 23, 13
  • 58. Para saber más... (1/3) Wednesday, October 23, 13
  • 59. Para saber más... (2/3) Wednesday, October 23, 13
  • 60. Para saber más... (3/3) • http://tryhaskell.org/ Tutorial interactivo en línea • http://www.haskell.org Sitio oficial de Haskell • http://j.mp/1cMCJr5 Yet Another Haskell Tutorial Wednesday, October 23, 13
  • 64. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional Wednesday, October 23, 13
  • 65. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. Wednesday, October 23, 13
  • 66. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. Wednesday, October 23, 13
  • 67. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Wednesday, October 23, 13
  • 68. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Reunión quincenal para practicar Haskell Wednesday, October 23, 13
  • 69. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Reunión quincenal para practicar Haskell y platicar sobre Programación Funcional Wednesday, October 23, 13
  • 70. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Reunión quincenal para practicar Haskell y platicar sobre Programación Funcional Wednesday, October 23, 13
  • 71. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Reunión quincenal para practicar Haskell y platicar sobre Programación Funcional Wednesday, October 23, 13
  • 72. Para saber más... @Lambda_Mx Grupo de Interés en Programación Funcional en México, D.F. #HaskellDojoMx Reunión quincenal para practicar Haskell y platicar sobre Programación Funcional Wednesday, October 23, 13