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
  1. Expresiones. 
  2. Variables
  3. 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\lambda x.x \quad \lambda y.y \quad \lambda 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

  • 774