Caml (originalmente un acrónimo de categóricos Abstract Machine Language ) es un multi-paradigma , lenguaje de programación de propósito general que es un dialecto del lenguaje de programación ML familia. Caml se desarrolló en Francia en INRIA y ENS .
Paradigma | Multi-paradigma : funcional , imperativo |
---|---|
Familia | ML |
Diseñada por | Gérard Huet , Guy Cousineau , Ascánder Suárez , Pierre Weis , Michel Mauny (Heavy Caml), Xavier Leroy (Caml Light) |
Apareció por primera vez | 1985 |
Lanzamiento estable | 0,75 [1] / 26 de enero de 2002 |
Disciplina de mecanografía | Inferido , estático , fuerte |
SO | Multiplataforma |
Sitio web | caml |
Influenciado por | |
ML | |
Influenciado | |
OCaml |
Caml se escribe estáticamente , se evalúa estrictamente y utiliza la administración automática de memoria . OCaml , el descendiente principal de Caml, agrega muchas características al lenguaje, incluida una capa de objeto .
Ejemplos de
A continuación, #
representa el indicador de Caml.
Hola Mundo
print_endline "¡Hola, mundo!" ;;
Función factorial (recursividad y programación puramente funcional)
Muchas funciones matemáticas, como factorial, se representan de forma más natural en una forma puramente funcional. La siguiente función de Caml recursiva y puramente funcional implementa factorial:
sea rec hecho n = si n = 0 entonces 1 si no n * hecho ( n - 1 ) ;;
La función se puede escribir de forma equivalente utilizando la coincidencia de patrones :
deje rec hecho = función | 0 -> 1 | n -> n * hecho ( n - 1 ) ;;
Esta última forma es la definición matemática de factorial como relación de recurrencia.
Tenga en cuenta que el compilador infirió el tipo de esta función , lo que significa que esta función mapea ints sobre ints. 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 transmitir funciones en los programas Caml. Esta capacidad tiene una enorme cantidad de aplicaciones. Calcular la derivada numérica de una función es una de esas aplicaciones. La siguiente función de Caml d
calcula la derivada numérica de una función dada f
en un punto dado x
:
sea d delta f x = ( f ( x +. delta ) -. f ( x -. delta )) /. ( 2 . *. Delta ) ;;
Esta función requiere un valor pequeño delta
. Una buena opción para delta es la raíz cúbica de la máquina épsilon [ cita requerida ] .
El tipo de la función d
indica que asigna float
a otra función con el tipo . Esto nos permite aplicar argumentos parcialmente. Este estilo funcional se conoce como curry . En este caso, es útil aplicar parcialmente el primer argumento que , para obtener una función más especializada:(float -> float) -> float -> float
delta
d
# sea d = d ( sqrt epsilon_float ) ;; val d : ( flotar -> flotar ) -> flotar -> flotar = < divertido >
Tenga en cuenta que el tipo inferido indica que el reemplazo d
espera una función con el tipo como primer argumento. Podemos calcular una aproximación numérica a la derivada defloat -> float
a con:
# d ( divertido x -> x *. x *. x -. x -. 1. ) 3. ;; - : flotador = 26 .
La respuesta correcta es .
La función d
se llama "función de orden superior" porque acepta otra función ( f
) como argumento. Podemos ir más allá y crear la derivada (aproximada) de f, aplicando d
mientras se omite el x
argumento:
# sea f ' = d ( divertido x -> x *. x *. x -. x -. 1. ) ;; val f ' : flotar -> flotar = < divertido >
Los conceptos de funciones de curry y de orden superior son claramente útiles en programas matemáticos. De hecho, estos conceptos son igualmente aplicables a la mayoría de las otras formas de programación y se pueden usar para factorizar el código de manera mucho más agresiva, lo que resulta en programas más cortos y menos errores.
Transformada de ondícula discreta (coincidencia de patrones)
La transformada de ondas 1D de Haar de una lista de números enteros de potencia de dos longitudes se puede implementar de manera muy sucinta en Caml y es un excelente ejemplo del uso de la coincidencia de patrones en listas, eliminando pares de elementos ( y ) del frente y almacenar sus sumas y diferencias en las listas y , respectivamente:h1
h2
s
d
# let haar l = let rec aux l s d = emparejar l , s , d con [ 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" en aux l [] [] ;; val haar : int list -> int list = < divertido >
Por ejemplo:
# haar [ 1 ; 2 ; 3 ; 4 ; - 4 ; - 3 ; - 2 ; - 1 ] ;; - : int lista = [ 0 ; 20 ; 4 ; 4 ; - 1 ; - 1 ; - 1 ; - 1 ]
La coincidencia de patrones permite representar transformaciones complicadas de forma clara y concisa. Además, el compilador Caml convierte las coincidencias de patrones en código muy eficiente, lo que a veces da como resultado programas que son más cortos y más rápidos que el código equivalente escrito con una declaración de caso (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 Informática 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 nueva versión completa que agregó un poderoso sistema de módulos al lenguaje central. Se amplió con una capa de objeto para convertirse en Objective Caml , que finalmente se renombró como OCaml .
Ver también
Referencias
- ^ "Último lanzamiento de Caml Light" . Consultado el 22 de febrero de 2020 .
- ^ a b c "Una historia de Caml" , inria.fr
Bibliografía
- El enfoque funcional de la programación con Caml por Guy Cousineau y Michel Mauny.
- Cardelli, Luca (1984). Elaboración de un Simposio ACM en lenguaje funcional sobre LISP y programación funcional , Asociación de Maquinaria Informática.
enlaces externos
- Sitio web oficial - familia lingüística Caml