Práctica #8

Lenguajes Funcionales

  • Características de los Lenguajes Funcionales

    Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas basadas en el cálculo lambda, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus sobrexpresiones), y por tanto, la carencia total de efectos colaterales.

  • Haskell

    • Características
    • Incluye muchas de las últimas innovaciones en el desarrollo de los lenguajes de programación funcional, como son las funciones de orden superior, evaluación perezosa, tipos polimórficos estáticos, tipos definidos por el usuario, encaje por patrones, y definiciones de listas.

      --Sumar elementos de una lista
      sumar :: [Int] -> Int
      sumar [] = 0
      sumar (x:xs) = x+sumar(xs)
                                              

  • Erlang

    En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de respuesta en tiempo real, donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición.

    -module(fact).
    -export([factorial/1]).
    
    
    factorial(N) ->
        factorial(1, N, 1).
    
    factorial(Current, N, Result) when Current =< N ->
        NewResult = Result * Current,
        factorial(Current+1, N, NewResult);
    
    factorial(_, _, Result) ->
        Result.
                                        

  • LISP

    El LISP es un lenguaje funcional que se apoya en la utilización de funciones matemáticas para el control de los datos. Pero el elemento fundamental en el LISP es la lista. Y desde el punto de vista más amplio del término. Cada función del LISP y cada programa que generemos con él vienen dado en forma de lista. Por esta razón los datos no se pueden diferenciarse sintácticamente de los programas.

    (defun factorial (n)
        (if (= n 0)
            1
        (* n (factorial (- n 1))) ) )
        (loop for i from 0 to 16
            do (format t "~D! = ~D~%" i (factorial i)) )
                                        

  • Scheme

    La filosofía de Scheme es minimalista. Su objetivo no es acumular un gran número de funcionalidades, sino evitar las debilidades y restricciones que hacen necesaria su adicción. Así, Scheme proporciona el mínimo número posible de nociones primitivas, construyendo todo lo demás a partir de un reducido número de abstracciones. Por ejemplo, el mecanismo principal para el control de flujo son las llamadas recursivas finales.

    (define (factorial n)
        (cond ((< n 0) #f)
            ((<= n 1) 1)
        (else (* n (factorial (- n 1))))))