stringtranslate.com

camell

Caml (originalmente un acrónimo de Categorical Abstract Machine Language ) es un lenguaje de programación multiparadigma de propósito general que es un dialecto de la familia de lenguajes de programación ML . Caml fue desarrollado en Francia en INRIA y ENS .

Caml se escribe estáticamente , se evalúa estrictamente y utiliza administración automática de memoria . OCaml , el principal descendiente de Caml, agrega muchas características al lenguaje, incluida una capa de objetos .

Ejemplos

A continuación, #se representa el mensaje Caml.

Hola Mundo

print_endline  "¡Hola mundo!" ;;

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

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

let  rec  fact  n  =  si  n = 0  entonces  1  else  n  *  fact ( n  -  1 );;

La función se puede escribir de manera equivalente usando la coincidencia de patrones :

let  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 dedujo que el tipo de esta función era , lo que significa que esta función asigna enteros a enteros. Por ejemplo, ¡12! es:int -> int

 #  hecho  12 ;;  -  :  entero  =  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 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 Caml dcalcula la derivada numérica de una función determinada 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 delta. Una buena opción para delta es la raíz cúbica de la máquina épsilon [ cita requerida ] .

El tipo de función dindica que asigna a a floatotra 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 a , para obtener una función más especializada:(float -> float) -> float -> floatdeltad

#  let  d  =  d  ( sqrt  epsilon_float );; val  d  :  ( flotante  ->  flotante )  - >  flotante  -  > flotante  =  <divertido>

Tenga en cuenta que el tipo inferido indica que el reemplazo despera una función con el tipo como primer argumento. Podemos calcular una aproximación numérica a la derivada de at con:float -> float

#  d  ( divertido  x  ->  x  *.  x  * .  x  -.  x  -.  1 .)  3 .;; -  :  flotante  =  26 .

La respuesta correcta es .

La función dse denomina " 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 dy omitiendo el xargumento:

#  let  f'  =  d  ( divertido  x  ->  x  *.  x  *.  x  -.  x  -.  1 .)  ;; val  f'  :  flotante  ->  flotante  =  < diversión >

Los conceptos de funciones al 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 pueden usarse para factorizar código de manera mucho más agresiva, lo que resulta en programas más cortos y menos errores.

Transformada wavelet discreta (coincidencia de patrones)

La transformada wavelet 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 coincidencia de patrones en listas, tomando pares de elementos ( y ) del frente. y almacenar sus sumas y diferencias en las listas y , respectivamente:h1h2sd

#  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  "pelo"  en  l auxiliar [  ] [] ;; val haar : lista int -> lista int = < diversión >           

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 complicadas de forma clara y sucinta. 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 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 Ascander 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 reescritura completa que agregó un potente sistema de módulos al lenguaje principal. Se amplió con una capa de objeto para convertirse en Objective Caml y finalmente se renombró OCaml .

Ver también

Referencias

  1. ^ "Último lanzamiento de Caml Light" . Consultado el 22 de febrero de 2020 .
  2. ^ abc "Una historia de Caml", inria.fr

Bibliografía

enlaces externos