Камл
Парадигма | Мультипарадигмальность : функциональная , императивная. |
---|---|
Семья | МЛ |
Разработано | Жерар Юэ , Ги Кузино, Аскандер Суарес, Пьер Вайс, Мишель Мони (Heavy Caml), Ксавье Лерой (Caml Light) |
Разработчик | ИНРИА , ЭНС |
Впервые появился | 1985 год |
Стабильная версия | 0.75 [1]
/ 26 января 2002 г |
Дисциплина набора текста | предполагаемый , статичный , сильный |
Управление памятью | автоматический |
ТЫ | Кроссплатформенность : Unix , Linux , macOS ; Окна |
Лицензия | QPL 1, LGPL 2 (Верблюжий свет) |
Веб-сайт | камл |
Под влиянием | |
МЛ | |
Под влиянием | |
OCaml |
Caml (первоначально аббревиатура от Categorical Abstract Machine Language ) — это многопарадигмальный , общего назначения , высокоуровневый , функциональный язык программирования который является диалектом семейства языков программирования ML . Caml был разработан во Франции во Французском институте исследований в области компьютерных наук и автоматизации (INRIA) и Высшей нормальной школе (Париж) (ENS).
Caml статически типизирован , строго оценивается и использует автоматическое управление памятью . OCaml , основной потомок Caml, добавляет в язык множество функций, включая уровень объектно-ориентированного программирования (объектный).
Примеры
[ редактировать ]В дальнейшем #
представляет приглашение Caml.
Привет, мир
[ редактировать ]« Привет, мир!» программа это:
print_endline "Hello, world!";;
Функция факториала (рекурсия и чисто функциональное программирование)
[ редактировать ]Многие математические функции, например факториал, наиболее естественно представить в чисто функциональной форме. Следующая рекурсивная чисто функциональная функция Caml реализует факториал:
let rec fact n = if n=0 then 1 else n * fact(n - 1);;
Функцию можно записать эквивалентно, используя сопоставление с образцом :
let rec fact = function
| 0 -> 1
| n -> n * fact(n - 1);;
Эта последняя форма представляет собой математическое определение факториала как рекуррентного отношения.
Обратите внимание, что компилятор определил тип этой функции как int -> int
, что означает, что эта функция отображает целые числа на целые. Например, 12! является:
# fact 12;;
- : int = 479001600
Числовая производная (функции высшего порядка)
[ редактировать ]Поскольку Caml является функциональным языком программирования , в программах Caml легко создавать и передавать функции. Эта способность имеет очень много применений. Одним из примеров является вычисление числовой производной функции. Следующая функция Caml d
вычисляет числовую производную заданной функции f
в данный момент x
:
let d delta f x =
(f (x +. delta) -. f (x -. delta)) /. (2. *. delta);;
Эта функция требует небольшого значения delta
. Хорошим выбором для дельты является кубический корень из машинного эпсилона . [ нужна ссылка ] .
Тип функции d
указывает на то, что он отображает float
на другую функцию типа (float -> float) -> float -> float
. Это позволяет нам частично применять аргументы. Этот функциональный стиль известен как каррирование . В этом случае полезно частично применить первый аргумент delta
к d
, чтобы получить более специализированную функцию:
# let d = d (sqrt epsilon_float);;
val d : (float -> float) -> float -> float = <fun>
Обратите внимание, что выведенный тип указывает, что замена d
ожидает функцию типа float -> float
в качестве первого аргумента. Мы можем вычислить численное приближение к производной в с:
# d (fun x -> x *. x *. x -. x -. 1.) 3.;;
- : float = 26.
Правильный ответ .
Функция d
называется « функцией высшего порядка », поскольку она принимает другую функцию ( f
) в качестве аргумента.
Двигаясь дальше, можно создать (приблизительную) производную от f, применив d
опуская при этом x
аргумент:
# let f' = d (fun x -> x *. x *. x -. x -. 1.) ;;
val f' : float -> float = <fun>
Понятия каррирования и функций высшего порядка явно полезны в математических программах. Эти концепции в равной степени применимы к большинству других форм программирования и могут использоваться для более агрессивной факторизации кода, что приводит к сокращению программ и меньшему количеству ошибок.
Дискретное вейвлет-преобразование (сопоставление с образцом)
[ редактировать ]Одномерное Хаара вейвлет- преобразование для целочисленного списка чисел длиной в степени двойки может быть очень лаконично реализовано в Caml и является отличным примером использования сопоставления с образцом в списках, берущих пары элементов ( h1
и h2
) с фронта и сохранение их сумм и разностей в списках s
и d
, соответственно:
# 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>
Например:
# haar [1; 2; 3; 4; -4; -3; -2; -1];;
- : int list = [0; 20; 4; 4; -1; -1; -1; -1]
Сопоставление с образцом позволяет четко и кратко представить сложные преобразования. Более того, компилятор Caml превращает сопоставления с шаблонами в очень эффективный код, что иногда приводит к тому, что программы оказываются короче и быстрее, чем эквивалентный код, написанный с использованием оператора case (Cardelli 1984, стр. 210).
История
[ редактировать ]Первая реализация Caml была написана на Лиспе Аскандером Суаресом в 1987 году во Французском институте исследований в области компьютерных наук и автоматизации (INRIA). [2]
Его преемник, Caml Light , был реализован на C Ксавье Леруа и Дэмьеном Долигезом , [2] а оригинал получил прозвище «Heavy Caml» из-за более высоких требований к памяти и процессору. [2]
Caml Special Light представлял собой еще одну полную переработку, в результате которой к основному языку добавилась мощная система модулей. Он был дополнен слоем объектно-ориентированного программирования (объектного) и стал Objective Caml , в конечном итоге переименованным в OCaml .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Последний выпуск Caml Light» . Проверено 22 февраля 2020 г. .
- ^ Перейти обратно: а б с «История Caml» , inria.fr
Библиография
[ редактировать ]- Функциональный подход к программированию с помощью Caml. Архивировано 24 декабря 2007 г. в Wayback Machine Гаем Кузино и Мишелем Мони.
- Карделли, Лука (1984). Компиляция функционального языка ACM. Симпозиум по LISP и функциональному программированию , Ассоциация компьютерной техники.
Внешние ссылки
[ редактировать ]- Официальный сайт ИНРИА