sábado, 19 de octubre de 2013

Conociendo ML


ML es un lenguaje funcional desarrollado por Robin Milner en los años 70, no es un lenguaje muy usado pero esta lleno de conceptos que son usados en otros lenguajes.

Vamos por parte, es un lenguaje Funcional por lo tanto las funciones son ciudadanos de primera clase. Y a la vez hace un uso intensivo de recursividad, veamos un ejemplo:

fun fac (0 : int) : int = 1
  | fac (n : int) : int = n * fac (n - 1)

Como pueden ver en el ejemplo es de tipado estático, es decir tenes que poner expresamente el tipo, el compilador no lo infiere.

También tiene listas y las listas son tipadas:

- [];
val it = [] : 'a list
- [1,2,3,4,5]
= ;
val it = [1,2,3,4,5] : int list
- [2,3,"hola"];
stdIn:7.1-7.13 Error: operator and operand don't agree [literal]
  operator domain: int * int list
  operand:         int * string list
  in expression:
    3 :: "hola" :: nil

El error es porque quiero poner elementos de diferente tipo en la misma lista. 

Como la mayoria de los lenguajes funcionales ven una lista como el ultimo elemento y el resto; lo que permite junto a la recursividad hacer cosas muy interesantes:

fun contar (xs : int list) : int =
      if null xs then 0
      else 1 + contar(tl xs)
;
contar([1,2,3,4,5]);

Aclaro que null es una función que nos indica que la lista es vacía, y el algoritmo hace lo siguiente si la lista es vacía devuelve 0, si no devuelve 1 más la cantidad de el resto de los elementos de la lista. Con la función tl obtenemos el resto de la lista, sin el ultimo elemento, veamos otro ejemplo:

fun sumar (xs : int list) : int =
      if null xs then 0
      else hd xs + sumar(tl xs)
;
sumar([1,2,3,4,5]);

Con la función hd tomamos el ultimo elemento, es decir que lo que estamos diciendo es que la suma de todos los elementos es igual a la suma del ultimo elemento más la suma de los demás elementos.

Prometo otros posts!

Dejo link:
http://en.wikipedia.org/wiki/ML_(programming_language)