P1N6Ü1N0 - CAML



Inicio
C
Perl
Caml
Shell
GTK
SQL

Caml es un lenguaje de programación funcional desarrollado por el inria (Francia)

La programación funcional es un modelo de programación algo diferente al que seguramente estareis habituados, no se parece mucho a la programación imperativa convencional, típica de C, Pascal, etc.

En programación funcional, como su nombre indica, todo son funciones, excepto los valores. No existen variables, ni procedimientos. Ni tampoco son necesarios. ¿Cómo se hace un programa entonces? Pues un programa será seguramente una función, que recibe unos parámetros, y devuelve un resultado.

¿Y cómo programas sin variables? Las variables simplemente sirven para guardar un estado entre distintas instrucciones que se ejecutan secuencialmente. En programación funcional no existe la composición secuencial de instrucciones (aunque Caml la permite para casos muy raros en que pueda ser necesaria). Entonces las variables no hacen falta, porque una función empieza, realiza una transformación sobre los parámetros, y devuelve un resultado. Precisamente se utiliza mucho el concepto de función recursiva, para realizar tareas que en programación convencional se realizan con bucles.

Por ejemplo, veamos cómo se haría en caml una función que recibe una lista de números enteros y devuelve la misma lista con todos los elementos multiplicados por 2:

let rec funcion = function
   [] -> []
 | cabeza::cola -> (cabeza*2)::(funcion cola);;

En este ejemplo, además de la recursividad, se utiliza otra de las potentes herramientas que tiene la programación funcional, que es el pattern matching, que consiste en definir como se comporta la funcion ante determinados patrones.

[]
representa la lista vacía, es decir, que ante una lista vacía, la función devuelve otra lista vacía.

::
representa la inserción de un elemento a la cabeza de una lista, es decir, que cuando nos llegue una lista que no sea vacía, encajará con ese patrón, porque cualquier lista no vacía, es un elemento a la cabeza, seguido de otra lista sin ese elemento (posiblemente vacía). Por tanto, cuando nos llegue una lista cualquiera, ese patron además extrae el primer elemento de ella y el resto de la lista, con lo que debemos devolver justamente el elemento duplicado, seguido de la misma lista despues de aplicarle la funcion recursivamente.

Si le pasamos la lista:

[1;2;3;4]

El comportamiento será

funcion [1;2;3;4] -> 
2::(funcion [2;3;4]) -> 
2::4::(funcion [3;4]) ->
2::4::6::(funcion [4]) ->
2::4::6::8::(funcion []) ->
2::4::6::8::[] = [2;4;6;8]

Y justamente [2;4;6;8] es lo que devuelve la función si la aplicamos a la lista [1;2;3;4]

Generalmente, los programas desarrollados en Caml, suelen ser mucho más pequeños que sus equivalentes en C o incluso en C++. Por si sirve de ejemplo, hace poco realicé una práctica para clase de implementación de varios algoritmos de Inteligencia Artificial. La hice en C++, utilizando patrones de diseño y factorizando el código todo lo que pude. Fueron 9000 líneas de código fuente, quitando la interfaz en GTK, quizas quedaría en 6000. En cualquier caso, un compañero de clase la hizo en Caml, exactamente la misma práctica, y los mismos algoritmos, y tan solo le ocupó 700 líneas de código... ¡10 veces menos!

En general, cuando hay que programar algoritmos que manejan mucho estructuras de datos complejas, como listas, o árboles, en un lenguaje funcional el código se reduce considerablemente.

Por ahora esto es todo, espero que a alguien le pique la curiosidad de aprender algo más sobre programación funcional con esta pequeña (ínfima) introducción.

Página oficial de caml: http://pauillac.inria.fr/caml/

  Los gráficos de esta página han sido creados con GIMP.