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/