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

#sgvirtual

Tuesday, October 29, 13
¿Qué es Haskell?

Tuesday, October 29, 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.
Tuesday, October 29, 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

http://j.mp/1catJLQ
Tuesday, October 29, 13

¡Necesitamos Haskell!
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

Tuesday, October 29, 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

Tuesday, October 29, 13
Características
•
•
•
•
•
•
•
•
•

List comprehensions.
Pattern matching.
Currying
Function Composition
Infinite data structures.
Agebraic Data Types
Type classes.
Applicative Functors
Monads

Tuesday, October 29, 13
Ejemplos

Tuesday, October 29, 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]

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

Tuesday, October 29, 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]

Tuesday, October 29, 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

Tuesday, October 29, 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 -- ($) Se llama ‘apply’
> even $ 4

Tuesday, October 29, 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)

Tuesday, October 29, 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

Tuesday, October 29, 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]]

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

Tuesday, October 29, 13

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
Currying
Prelude > let sum x y z = x + y + z
Prelude > sum 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

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

Tuesday, October 29, 13
Evaluación Perezosa
Ejemplo: El triángulo de Pascal

Tuesday, October 29, 13
Evaluación Perezosa

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

Tuesday, October 29, 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

Tuesday, October 29, 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

Tuesday, October 29, 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

Tuesday, October 29, 13
¿Por qué aprender
Haskell?

Tuesday, October 29, 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

Tuesday, October 29, 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

Tuesday, October 29, 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 conviertes en mejor programador

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

Tuesday, October 29, 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.

Tuesday, October 29, 13
Porque...

Tuesday, October 29, 13

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

Tuesday, October 29, 13
Para saber más... (2/3)

Tuesday, October 29, 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

Tuesday, October 29, 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

Tuesday, October 29, 13
¿Preguntas?

Tuesday, October 29, 13
¡Gracias!

Agustín Ramos Fonseca
@MachinesAreUs
Tuesday, October 29, 13

Weitere ähnliche Inhalte

Was ist angesagt?

DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foobrian_dailey
 
(Fun clojure)
(Fun clojure)(Fun clojure)
(Fun clojure)Timo Sulg
 
ALF 5 - Parser Top-Down (2018)
ALF 5 - Parser Top-Down (2018)ALF 5 - Parser Top-Down (2018)
ALF 5 - Parser Top-Down (2018)Alexandru Radovici
 
Coding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBMCoding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBMRaveen Perera
 
OCamlOScope: a New OCaml API Search
OCamlOScope: a New OCaml API SearchOCamlOScope: a New OCaml API Search
OCamlOScope: a New OCaml API SearchJun Furuse
 
[EN] Ada Lovelace Day 2014 - Tampon run
[EN] Ada Lovelace Day 2014  - Tampon run[EN] Ada Lovelace Day 2014  - Tampon run
[EN] Ada Lovelace Day 2014 - Tampon runMaja Kraljič
 
.Net 4.0 Threading and Parallel Programming
.Net 4.0 Threading and Parallel Programming.Net 4.0 Threading and Parallel Programming
.Net 4.0 Threading and Parallel ProgrammingAlex Moore
 
It's the end of design patterns as we know it (and i feel fine)
It's the end of design patterns as we know it (and i feel fine)It's the end of design patterns as we know it (and i feel fine)
It's the end of design patterns as we know it (and i feel fine)Luiz Borba
 
Argparse: Python command line parser
Argparse: Python command line parserArgparse: Python command line parser
Argparse: Python command line parserTimo Stollenwerk
 
Shell programming 2
Shell programming 2Shell programming 2
Shell programming 2Gourav Varma
 
Shell programming 2
Shell programming 2Shell programming 2
Shell programming 2Kalkey
 
Python for Linux System Administration
Python for Linux System AdministrationPython for Linux System Administration
Python for Linux System Administrationvceder
 
Session 02 python basics
Session 02 python basicsSession 02 python basics
Session 02 python basicsbodaceacat
 
A brief introduction to functional programming
A brief introduction to functional programmingA brief introduction to functional programming
A brief introduction to functional programmingSebastian Wild
 

Was ist angesagt? (20)

DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foo
 
(Fun clojure)
(Fun clojure)(Fun clojure)
(Fun clojure)
 
01 linux basics
01 linux basics01 linux basics
01 linux basics
 
ALF 5 - Parser Top-Down (2018)
ALF 5 - Parser Top-Down (2018)ALF 5 - Parser Top-Down (2018)
ALF 5 - Parser Top-Down (2018)
 
Coding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBMCoding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBM
 
OCamlOScope: a New OCaml API Search
OCamlOScope: a New OCaml API SearchOCamlOScope: a New OCaml API Search
OCamlOScope: a New OCaml API Search
 
Python 3
Python 3Python 3
Python 3
 
Let's golang
Let's golangLet's golang
Let's golang
 
[EN] Ada Lovelace Day 2014 - Tampon run
[EN] Ada Lovelace Day 2014  - Tampon run[EN] Ada Lovelace Day 2014  - Tampon run
[EN] Ada Lovelace Day 2014 - Tampon run
 
Gnuplot 2
Gnuplot 2Gnuplot 2
Gnuplot 2
 
.Net 4.0 Threading and Parallel Programming
.Net 4.0 Threading and Parallel Programming.Net 4.0 Threading and Parallel Programming
.Net 4.0 Threading and Parallel Programming
 
Vim Notes
Vim NotesVim Notes
Vim Notes
 
It's the end of design patterns as we know it (and i feel fine)
It's the end of design patterns as we know it (and i feel fine)It's the end of design patterns as we know it (and i feel fine)
It's the end of design patterns as we know it (and i feel fine)
 
Argparse: Python command line parser
Argparse: Python command line parserArgparse: Python command line parser
Argparse: Python command line parser
 
Pythonの紹介
Pythonの紹介Pythonの紹介
Pythonの紹介
 
Shell programming 2
Shell programming 2Shell programming 2
Shell programming 2
 
Shell programming 2
Shell programming 2Shell programming 2
Shell programming 2
 
Python for Linux System Administration
Python for Linux System AdministrationPython for Linux System Administration
Python for Linux System Administration
 
Session 02 python basics
Session 02 python basicsSession 02 python basics
Session 02 python basics
 
A brief introduction to functional programming
A brief introduction to functional programmingA brief introduction to functional programming
A brief introduction to functional programming
 

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
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellJosé A. Alonso
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskellSoftware Guru
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONALFredy Olaya
 
Estructuras de control en Java
Estructuras de control en JavaEstructuras de control en Java
Estructuras de control en Javaquesada_diego
 
PARADIGMA LOGICO
PARADIGMA LOGICOPARADIGMA LOGICO
PARADIGMA LOGICOFredy Olaya
 
Administracion de mercadotecnia
Administracion de mercadotecniaAdministracion de mercadotecnia
Administracion de mercadotecniaJose Salas
 
Planificación y modelado del sistema de una pizzeria.
Planificación y modelado del sistema de una pizzeria.Planificación y modelado del sistema de una pizzeria.
Planificación y modelado del sistema de una pizzeria.Luis Cigarroa
 
Proyecto Pizza
Proyecto PizzaProyecto Pizza
Proyecto PizzaFEUCE-I
 

Andere mochten auch (18)

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
 
Haskell
HaskellHaskell
Haskell
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
Intro haskell
Intro haskellIntro haskell
Intro haskell
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con Haskell
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
 
Programación Funcional con Scheme
Programación Funcional con SchemeProgramación Funcional con Scheme
Programación Funcional con Scheme
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONAL
 
Estructuras de control en Java
Estructuras de control en JavaEstructuras de control en Java
Estructuras de control en Java
 
PARADIGMA LOGICO
PARADIGMA LOGICOPARADIGMA LOGICO
PARADIGMA LOGICO
 
Administracion de mercadotecnia
Administracion de mercadotecniaAdministracion de mercadotecnia
Administracion de mercadotecnia
 
Planificación y modelado del sistema de una pizzeria.
Planificación y modelado del sistema de una pizzeria.Planificación y modelado del sistema de una pizzeria.
Planificación y modelado del sistema de una pizzeria.
 
Plan de negocio pizzeria
Plan de negocio pizzeriaPlan de negocio pizzeria
Plan de negocio pizzeria
 
Proyecto Pizza
Proyecto PizzaProyecto Pizza
Proyecto Pizza
 
Pizza hut
Pizza hutPizza hut
Pizza hut
 
Haskell - Intro
Haskell - IntroHaskell - Intro
Haskell - Intro
 
Semana 1 el control en la empresa
Semana 1 el control en la empresaSemana 1 el control en la empresa
Semana 1 el control en la empresa
 

Ähnlich wie Programación Funcional en Haskell Guía Completa

JavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java DevelopersJavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java DevelopersJan Kronquist
 
Haskell retrospective
Haskell retrospectiveHaskell retrospective
Haskell retrospectivechenge2k
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Developmentmircodotta
 
The Not Java That's Not Scala
The Not Java That's Not ScalaThe Not Java That's Not Scala
The Not Java That's Not ScalaJustin Lee
 
Introduction to Ruby & Ruby on Rails
Introduction to Ruby & Ruby on RailsIntroduction to Ruby & Ruby on Rails
Introduction to Ruby & Ruby on RailsMarcelo Pinheiro
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4Jan Berdajs
 
Mastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and TireMastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and TireLuca Bonmassar
 
Python 培训讲义
Python 培训讲义Python 培训讲义
Python 培训讲义leejd
 
Geeks Anonymes - Le langage Go
Geeks Anonymes - Le langage GoGeeks Anonymes - Le langage Go
Geeks Anonymes - Le langage GoGeeks Anonymes
 
Gogo shell
Gogo shellGogo shell
Gogo shelljwausle
 
Lout example
Lout exampleLout example
Lout examplelihlii
 
Concurrency
ConcurrencyConcurrency
Concurrencyehuard
 
FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳Yuri Inoue
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fuclimatewarrior
 
Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?osfameron
 

Ähnlich wie Programación Funcional en Haskell Guía Completa (20)

Clojure night
Clojure nightClojure night
Clojure night
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
JavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java DevelopersJavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java Developers
 
Programação Funcional
Programação FuncionalProgramação Funcional
Programação Funcional
 
Haskell retrospective
Haskell retrospectiveHaskell retrospective
Haskell retrospective
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Development
 
The Not Java That's Not Scala
The Not Java That's Not ScalaThe Not Java That's Not Scala
The Not Java That's Not Scala
 
Introduction to Ruby & Ruby on Rails
Introduction to Ruby & Ruby on RailsIntroduction to Ruby & Ruby on Rails
Introduction to Ruby & Ruby on Rails
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4
 
Mastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and TireMastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and Tire
 
Python 培训讲义
Python 培训讲义Python 培训讲义
Python 培训讲义
 
Haskell
HaskellHaskell
Haskell
 
Geeks Anonymes - Le langage Go
Geeks Anonymes - Le langage GoGeeks Anonymes - Le langage Go
Geeks Anonymes - Le langage Go
 
Gogo shell
Gogo shellGogo shell
Gogo shell
 
Lout example
Lout exampleLout example
Lout example
 
Concurrency
ConcurrencyConcurrency
Concurrency
 
FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳FP in scalaで鍛える関数型脳
FP in scalaで鍛える関数型脳
 
DA_02_algorithms.pptx
DA_02_algorithms.pptxDA_02_algorithms.pptx
DA_02_algorithms.pptx
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fu
 
Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?
 

Mehr von Agustin Ramos

Exploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with ArcheometerExploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with ArcheometerAgustin Ramos
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017Agustin Ramos
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testingAgustin Ramos
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasAgustin Ramos
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?Agustin Ramos
 
Técnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseñoTécnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseñoAgustin Ramos
 
Acercándose a la entrega continua
Acercándose a la entrega continuaAcercándose a la entrega continua
Acercándose a la entrega continuaAgustin Ramos
 
Modelos de paralelismo y concurrencia
Modelos de paralelismo y concurrenciaModelos de paralelismo y concurrencia
Modelos de paralelismo y concurrenciaAgustin Ramos
 
Arquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que noArquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que noAgustin Ramos
 
Arqueología de software
Arqueología de softwareArqueología de software
Arqueología de softwareAgustin Ramos
 
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)Agustin Ramos
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoAgustin Ramos
 
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingenieroLa nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingenieroAgustin Ramos
 
Modularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidraModularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidraAgustin Ramos
 

Mehr von Agustin Ramos (15)

Exploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with ArcheometerExploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with Archeometer
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testing
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?
 
Técnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseñoTécnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseño
 
Acercándose a la entrega continua
Acercándose a la entrega continuaAcercándose a la entrega continua
Acercándose a la entrega continua
 
Modelos de paralelismo y concurrencia
Modelos de paralelismo y concurrenciaModelos de paralelismo y concurrencia
Modelos de paralelismo y concurrencia
 
Arquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que noArquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que no
 
Arqueología de software
Arqueología de softwareArqueología de software
Arqueología de software
 
Hola OSGi
Hola OSGiHola OSGi
Hola OSGi
 
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamiento
 
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingenieroLa nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
 
Modularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidraModularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidra
 

Programación Funcional en Haskell Guía Completa

  • 1. Programación Funcional en Haskell Agustín Ramos Fonseca #sgvirtual Tuesday, October 29, 13
  • 3. 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. Tuesday, October 29, 13
  • 4. 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 http://j.mp/1catJLQ Tuesday, October 29, 13 ¡Necesitamos Haskell!
  • 5. 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 Tuesday, October 29, 13
  • 6. 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 Tuesday, October 29, 13
  • 7. Características • • • • • • • • • List comprehensions. Pattern matching. Currying Function Composition Infinite data structures. Agebraic Data Types Type classes. Applicative Functors Monads Tuesday, October 29, 13
  • 9. 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] Tuesday, October 29, 13
  • 10. Listas Lista de Num [1,2,3,4,5] Lista (rango) de Char [‘a’..’z’] Lista de strings [Char] [“hola”,”mundo”] Tuesday, October 29, 13
  • 11. 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] Tuesday, October 29, 13
  • 12. 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 Tuesday, October 29, 13
  • 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 -- ($) Se llama ‘apply’ > even $ 4 Tuesday, October 29, 13
  • 14. 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) Tuesday, October 29, 13
  • 15. 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 Tuesday, October 29, 13
  • 16. 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]] Tuesday, October 29, 13
  • 17. Pattern Matching Prelude > Prelude > 1 Prelude > [2,3,4,5] Prelude > Prelude > 2 Prelude > Prelude > 5 Prelude > Prelude > “hola” Tuesday, October 29, 13 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
  • 18. Currying Prelude > let sum x y z = x + y + z Prelude > sum 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 Tuesday, October 29, 13
  • 19. Composición de Funciones Prelude > let foo = (*2).(+5) Prelude > :t foo foo :: Integer -> Integer Prelude > foo 4 18 Prelude > let strToUpper = map toUpper Prelude > let strToLower = map toLower Prelude > map ($ "WaZoWzky") $ map ((reverse).) [strToUpper, strToLower] ["YKZWOZAW","ykzwozaw"] Tuesday, October 29, 13
  • 20. Evaluación Perezosa Ejemplo: El triángulo de Pascal Tuesday, October 29, 13
  • 21. Evaluación Perezosa Solución: pascal n = take n $ iterate (r -> zipWith (+) ([0] ++ r) (r ++ [0])) [1] Tuesday, October 29, 13
  • 22. 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 Tuesday, October 29, 13
  • 23. 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 Tuesday, October 29, 13
  • 24. 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 Tuesday, October 29, 13
  • 26. ¿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 Tuesday, October 29, 13
  • 27. ¿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 Tuesday, October 29, 13
  • 28. ¿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 conviertes en mejor programador • Es una plataforma madura para el desarrollo de aplicaciones en el mundo real. Tuesday, October 29, 13
  • 29. ¿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. Tuesday, October 29, 13
  • 31. Para saber más... (1/3) Tuesday, October 29, 13
  • 32. Para saber más... (2/3) Tuesday, October 29, 13
  • 33. 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 Tuesday, October 29, 13
  • 34. 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 Tuesday, October 29, 13