Programación funcional
Haskell Hello World!
Todo tutorial sobre P. funcional
qUE ES PROGRAMACIÓN FUNCIONAL
Paradigma de programación (como OOP) en donde funciones son funciones matemáticas!
Idea principal: Programas son combinaciones de expresiones
En Haskell: Funciones son ciudadanas de primera clase
Lenguaje puro == transparencia referencial
Todo es
lambda
Nada desde casi nada
Calculo de lambdas
- Creado 1930 Alonzo Church
- Formaliza el concepto de computabilidad efectiva
- ¿Donde está Haskell?
- Primeros principios ¡Empieza desde abajo!
- lambda-términos
- Expresiones.
- Variables
- Abstraciones
SuperConjunto
Sin sentido o Valor
Calculo de lambdas
Abstraciones
- Abstracción es una función compuesta de cabeza y cuerpo
λ x . x
^─┬─^
└────── la extensión de la cabeza de el término lambda.
λ x . x
^────── El parámetro único de la función. Esta vincula
cualquier variable con el mismo nombre
En el cuerpo de la función.
λ x . x
^── cuerpo, La expresión lambda que se devuelve
cuando se aplica. Esta es una variable enlazada.
El punto (.) separa los parámetros
Equivalencia de Alfas
\lambda x.x \quad
\lambda y.y \quad
\lambda z.z
λx.xλy.yλz.z
REDUCCIÓN de betas
$$ \lambda xy. x (3) $$
Argumentos múltiples
$$ \lambda xy. x y $$
¡CURRYING!
Evaluación es simplificación
Formal normal beta
Programa totalmente ejecutado
DIVERGENCIA
Formal normal beta NO CONVERGE
$$ (\lambda x.xx)(\lambda x. xx) $$
Resumen
Formal normal beta NO CONVERGE
$$ (\lambda x.xx)(\lambda x. xx) $$
Instalación
$ curl -sSL https://get.haskellstack.org/ | sh
# o por si alguna razón no tenemos curl
$ sudo apt-get install wget
...
wget -qO- https://get.haskellstack.org/ | sh
Verificación
[dgromov@gl552vw Haskell]$ stack --version
Version 1.3.2, Git
Hola Mundo! Stack
[dgromov@gl552vw Haskell]$ stack new holamundo new-template
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- holamundo/holamundo.cabal
Selecting the best among 10 snapshots...
* Matches lts-8.5
Selected resolver: lts-8.5
Initialising configuration using resolver: lts-8.5
Total number of user packages considered: 1
Writing configuration to file: holamundo/stack.yaml
All done.
Instalemos ghc (dependiendo proyecto)
[dgromov@gl552vw holamundo]$ stack setup
Preparing to install GHC to an isolated location.
# Esperaremos a que stack baje la versión GHC requerida esta en stack.yaml resolver
This will not interfere with any system-level installation.
Downloaded ghc-8.0.2.
Unpacking GHC into /home/dgromov/.stack/programs/x86_64-linux/ghc-8.0.2.temp/ .. Installed GHC.
stack will use a sandboxed GHC it installed
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec
Stack build
Creando el ejecutable
[dgromov@gl552vw holamundo]$ stack build
[1 of 2] Compiling Main ( /home/dgromov/.stack/setup-exe-src/setup-mPHDZzAJ.hs, /home/dgromov/.stack/setup-exe-src/setup-mPHDZzAJ.o )
[2 of 2] Compiling StackSetupShim ( /home/dgromov/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs, /home/dgromov/.stack/setup-exe-src/setup-shim-mPHDZzAJ.o )
Linking /home/dgromov/.stack/setup-exe-cache/x86_64-linux/tmp-Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 ...
holamundo-0.1.0.0: configure (lib + exe)
Configuring holamundo-0.1.0.0...
holamundo-0.1.0.0: build (lib + exe)
Preprocessing library holamundo-0.1.0.0...
[1 of 1] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Lib.o )
Preprocessing executable 'holamundo-exe' for holamundo-0.1.0.0...
[1 of 1] Compiling Main ( app/Main.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/holamundo-exe/holamundo-exe-tmp/Main.o )
Stack exe
|Finalmente el ejecutable!
[dgromov@gl552vw holamundo]$ stack exec holamundo-exe
someFunc
Observaciones de stack.yaml
# This file was automatically generated by 'stack init'
#
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
# resolver: ghcjs-0.1.0_ghc-7.10.2
# resolver:
# name: custom-snapshot
# location: "./custom-snapshot.yaml"
resolver: lts-8.5
Programación funcional
By David Cardozo
Programación funcional
- 848