Articulo de referencia

Caml

{{cite web |title=Latest Caml Light release |url=http://caml.inria.fr/caml-light/release.en.html |access-date=22 February 2020}} "},"latest release date":{"wt":"{{Start date and...

Caml (originalmente acrónimo de Categorical Abstract Machine Language ) es un lenguaje de programación funcional , de alto nivel , de propósito general y multiparadigma, que pertenece a la familia de lenguajes de programación ML . Caml fue desarrollado en Francia, en el Instituto Francés de Investigación en Informática y Automatización (INRIA) y en la École normale supérieure (París) (ENS).

Caml es un lenguaje de tipado estático , de evaluación estricta y que utiliza gestión automática de memoria . OCaml , el principal descendiente de Caml, añade muchas características al lenguaje, incluyendo una capa de programación orientada a objetos (object).

Ejemplos

A continuación, #se representa el indicador de Caml.

Hola Mundo

Un programa "¡Hola, mundo!" es:

print_endline "¡Hola, mundo!" ;;

Función factorial (recursión y programación puramente funcional)

Muchas funciones matemáticas, como el factorial, se representan de forma más natural mediante una forma puramente funcional. La siguiente función recursiva y puramente funcional de Caml implementa el factorial:

sea ​​rec fact n = si n = 0 entonces 1 sino n * fact ( n - 1 );;

La función se puede escribir de forma equivalente utilizando la coincidencia de patrones :

let rec fact = function | 0 -> 1 | n -> n * fact ( n - 1 );;

Esta última forma es la definición matemática del factorial como una relación de recurrencia.

Tenga en cuenta que el compilador infirió el tipo de esta función como , lo que significa que esta función asigna enteros a enteros. Por ejemplo, 12! es:int->int

# hecho 12 ;; - : int = 479001600

Derivada numérica (funciones de orden superior)

Dado que Caml es un lenguaje de programación funcional , es fácil crear y pasar funciones en programas Caml. Esta capacidad tiene muchísimas aplicaciones. Calcular la derivada numérica de una función es un ejemplo. La siguiente función Caml dcalcula la derivada numérica de una función dada fen un punto determinado x:

sea ​​d delta f x = ( f ( x +. delta ) -. f ( x -. delta )) /. ( 2 . *. delta );;

Esta función requiere un valor pequeño . Una buena deltaopción para delta es la raíz cúbica del épsilon de la máquina .

El tipo de la función dindica que mapea a floatsobre otra función con el tipo . Esto nos permite aplicar parcialmente los argumentos. Este estilo funcional se conoce como currificación . En este caso, es útil aplicar parcialmente el primer argumento a , para obtener una función más especializada:(float->float)->float->floatdeltad

# let d = d ( sqrt epsilon_float );; val d : ( float -> float ) -> float -> float = < fun >

Nótese que el tipo inferido indica que el reemplazo despera una función con el tipo como su primer argumento. Podemos calcular una aproximación numérica a la derivada defloat->floatincógnita3incógnita1{\displaystyle x^{3}-x-1}enincógnita=3{\displaystyle x=3}con:

# d ( fun x -> x *. x *. x -. x -. 1 .) 3 .;; - : float = 26 .

La respuesta correcta esF(incógnita)=3incógnita21F(3)=271=26{\displaystyle f'(x)=3x^{2}-1\rightarrow f'(3)=27-1=26}.

La función dse denomina " función de orden superior " porque acepta otra función ( f) como argumento. Además, se puede crear la derivada (aproximada) de f, aplicando dmientras se omite el xargumento:

# let f' = d ( fun x -> x *. x *. x -. x -. 1 .) ;; val f' : float -> float = < fun >

Los conceptos de funciones currificadas y de orden superior son claramente útiles en la programación matemática. Estos conceptos son igualmente aplicables a la mayoría de las demás formas de programación y pueden utilizarse para refactorizar el código de forma mucho más agresiva, lo que resulta en programas más cortos y con menos errores.

Transformada discreta de ondículas (coincidencia de patrones)

La transformada wavelet de Haar 1D de una lista de números enteros de longitud potencia de dos se puede implementar de forma muy concisa en Caml y es un excelente ejemplo del uso de la coincidencia de patrones sobre listas, tomando pares de elementos ( y ) del principio y almacenando sus sumas y diferencias en las listas y , respectivamente:h1h2sd

# let haar l = let rec aux l s d = match l , s , d with [ s ], [] , d -> s :: d | [] , s , d -> aux s [] d | h1 :: h2 :: t , s , d -> aux t ( h1 + h2 :: s ) ( h1 - h2 :: d ) | _ -> invalid_arg "haar" in aux l [] [] ;; val haar : int list -> int list = < fun >

Por ejemplo:

# pelo [ 1 ; 2 ; 3 ; 4 ; - 4 ; - 3 ; - 2 ; - 1 ];; - : lista int = [ 0 ; 20 ; 4 ; 4 ; - 1 ; - 1 ; - 1 ; - 1 ]

La coincidencia de patrones permite representar transformaciones complejas de forma clara y concisa. Además, el compilador Caml convierte la coincidencia de patrones en código muy eficiente, lo que a veces da como resultado programas más cortos y rápidos que el código equivalente escrito con una sentencia case (Cardelli 1984, p.  210).

Historia

La primera implementación de Caml fue escrita en Lisp por Ascánder Suárez en 1987 en el Instituto Francés de Investigación en Ciencias de la Computación y Automatización (INRIA). [ 2 ]

Su sucesor, Caml Light , fue implementado en C por Xavier Leroy y Damien Doligez , [ 2 ] y el original fue apodado "Heavy Caml" debido a sus mayores requisitos de memoria y CPU. [ 2 ]

Caml Special Light fue una reescritura completa que añadió un potente sistema de módulos al lenguaje principal. Se le añadió una capa de programación orientada a objetos (object) para convertirse en Objective Caml , que finalmente pasó a llamarse OCaml .

Véase también

Referencias

  1. "Última versión de Caml Light" . Consultado el 22 de febrero de 2020 .
  2. 1 2 3 "Una historia de Caml" , inria.fr

Bibliografía

  • El enfoque funcional de la programación con Caml. Archivado el 24 de diciembre de 2007 en la Wayback Machine por Guy Cousineau y Michel Mauny.
  • Cardelli, Luca (1984). Compilación de un lenguaje funcional Simposio ACM sobre LISP y programación funcional , Asociación de Maquinaria Informática.
  • Sitio web oficial , INRIA