Download Lenguajes funcionales

Document related concepts
Transcript
Lenguajes funcionales
Lenguajes de
programación donde la
definición y aplicación
de funciones es la base
de la programación.
Lenguaje R
Lenguaje estadístico para el cómputo científico
Interpretado (o sea, un lenguaje script)
El paquete de ubuntu se llama r-base
Modo interactivo y desde archivo
Terminar con q()
http://www.r-project.org/
Probabilidad y Estadística (cuarto semestre ITS)
R básico
Asignación: x <- 7
Aritmética
+, -, *, / como en la primaria
^ para potencias
Iteración en R
Usando vectores
seq(from = 1, to = 21, by = 3)
rep(x, y) para repetir el valor x una cantidad y veces
c(...) para combinar sus argumentos en un vector
%% para módulo y %/% para división entera
Se puede omitir los nombres de los parámetros si se
respeta su órden por omisión
funciones básicas: exp(), log(), sqrt(), cos()
También tienen valores por omisión (p. ej. by = 1)
Jones, Maillardet & Robinson: Introduction to Scientific Programming and Simulation Using R, CRC 2009.
Acceso a vectores
Operaciones con vectores
Aritmética opera elemento
por elemento
x[i] da el elemento en posición i del vector x
Las posiciones se numeran 1, 2, 3...
Si un vector es más corta
que el otro, se repetirá
para compensar la
diferencia
Si la posición es un vector, el resultado es el
vector formada por las posiciones indicadas
Definienco posiciones en negativo, se omitirá las
posiciones definidas y el resultado será todos los
demás elementos del vector
Esto pasa también con
escalares
Expresiones
< > <= >= == != & | ! && ||
secuenciales
length(x)
min(x), max(x)
sort(x)
sqrt(x)
mean(x), var(x)
if (…) {
…
} else {
No improvisen otras
maneras de acomodar los {},
no es a libre elección en R.
… Operan con también con vectores
Particularmente útil: subset(x, subset = x > 2)
sum(x), prod(x)
Condiciones
Valores de verdad: TRUE y FALSE
Función xor()
Librerías
}
ifelse(cond, a, b)
Ciclos
for (x in vect) {
…
}
while (cond) {
…
}
Cálculo lambda
Propuesto en los 1930s como un modelo de
cómputo eficiente por Church
Equivalente en expresividad a las máquinas Turing
El fundamento teórico del paradigma funcional
Un lenguaje de programación “matemático”
Una regla de transformación + una esquema de
definición de funciones
Hasta las constantes deben ser expresadas como funciones
http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf
Gramática del cálculo !
<expresión> := <nombre> | <función> | <aplicación>
<función> := !<nombre>.<expresión>
<aplicación> := <expresión><expresión>
LISP
Lenguaje script (interpretado, interactivo)
La idea es definir funciones
Contiene condiciones (if)
La estructura de datos preferida es la lista
List Processing Language
Ciclos a través de recursión
No importa si escriben en minúscula o mayúscula
Ojo, en la mayoría de los lenguajes sí importa
Los proyectos sugeridos al final del .pdf de lectura
adicional son buenas oportunidades para puntos extra
http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf
http://www.cs.sfu.ca/CC/310/pwfong/Lisp/1/tutorial1.html
Ejemplos de expresiones
(+ 3
(* 3
(sin
(rem
(max
4)
(- 9 5) 16)
0.5)
13 5)
7 4 20 3 42 13)
Scheme
Dialecto de LISP, bueno para principiantes
(define (hola i)
(cond ((equal? i 1) (print "Hola."))
(else (print "Bye."))))
(define (dime) (hola 1))
(dime)
http://www.cs.hut.fi/Studies/T-93.210/schemetutorial/schemetutorial.html
(define (sumnext v)
(cond ((equal? v #f) (begin (print "Sum = ") 0))
! (else (+ (sumnext (cdr v)) (car v)))))
(define (get f c)
(cond ((equal? c 0) nil)
! (else (cons (read f) (get f (- c 1))))))
(define sum
(begin
(define f (open-input-file "numbers.dat"))
(define array (get f (read f)))
(print array)
(print " -> ")
(print (sumnext array))
(close-input-port f)))
(sum)
Datos: http://it.ciidit.uanl.mx/~elisa/teaching/prog/cap/numbers.dat
Otro dialecto de LISP
emacs LISP
emacs está escrito en ANSI-C +
su propio dialecto de LISP
se le puede agregar módulos
propios
ML estándar
paradigmas funcional & imperativo
tipos de datos int, real y word
todas las palabras clave en pura minúscula
concatenación de cadenas con ^
Ejemplo: conversión de base
val rec radix = fn (n, base) =>
let
val b = size base
val digit = fn n => str (String.sub (base, n))
val radix' =
fn (true, n) => digit n
| (false, n) => radix (n div b, base) ^ digit (n mod b)
in
radix' (n < b, n)
end;
ord y char para mover entre códigos ASCII y caracteres
fn para declarar funciones y val para darles nombres
http://homepages.inf.ed.ac.uk/stg/NOTES/
http://homepages.inf.ed.ac.uk/stg/NOTES/node19.html
Haskell
Erlang
puramente funcional
intérprete erl
versión compilada y versión interpretada
todas las expresiones terminan en un punto y
un espacio blanco
Linux, Windows y OS X
salir con halt().
bueno para cómputo paralelo
las expresiones parecen a las del lenguaje C, pero
la aritmética se hace en punto flotante
fac 0 = 1
fac n = n * fac (n-1)
main = print (fac 42)
http://www.haskell.org/
((23 - 17) / 7) * 5.
fac(0) -> 1;
fac(N) -> N * fac(N-1).
http://www.erlang.org/