Caml (первоначально аббревиатура для категоричных абстрактной машины языка ) представляет собой несколько парадигм , универсальный язык программирования , который является диалектом языка программирования ML семьи. Caml был разработан во Франции в INRIA и ENS .
Парадигма | Мультипарадигма : функциональная , императивная |
---|---|
Семья | ML |
Разработано | Жерар Юэ , Ги Кузино , Аскандер Суарес , Пьер Вайс , Мишель Мони (Heavy Caml), Ксавье Лерой (Caml Light) |
Впервые появился | 1985 г. |
Стабильный выпуск | 0,75 [1] / 26 января 2002 г . |
Печатная дисциплина | Предполагаемый , статический , сильный |
Операционные системы | Кроссплатформенность |
Веб-сайт | caml |
Под влиянием | |
ML | |
Под влиянием | |
OCaml |
Caml имеет статическую типизацию , строго оценивается и использует автоматическое управление памятью . OCaml , главный потомок Caml, добавляет в язык множество функций, включая объектный слой .
Примеры
Далее #
представляет приглашение Caml.
Привет мир
print_endline "Привет, мир!" ;;
Факториальная функция (рекурсия и чисто функциональное программирование)
Многие математические функции, такие как факториал, наиболее естественно представлены в чисто функциональной форме. Следующая рекурсивная чисто функциональная функция Caml реализует факториал:
let rec fact n = if n = 0 then 1 else n * fact ( n - 1 ) ;;
Функция может быть написана эквивалентно с использованием сопоставления с образцом :
пусть rec fact = function | 0 -> 1 | n -> n * fact ( n - 1 ) ;;
Эта последняя форма является математическим определением факториала как рекуррентного отношения.
Обратите внимание, что компилятор определил тип этой функции , что означает, что эта функция отображает целые числа на целые числа. Например, 12! является:int -> int
# fact 12 ;; - : int = 479001600
Числовая производная (функции высшего порядка)
Поскольку Caml является функциональным языком программирования , легко создавать и передавать функции в программах на Caml. Эта возможность имеет огромное количество приложений. Вычисление числовой производной функции - одно из таких приложений. Следующая функция Caml d
вычисляет числовую производную заданной функции f
в заданной точке x
:
пусть d delta f x = ( f ( x +. delta ) -. f ( x -. delta )) /. ( 2 . *. Дельта ) ;;
Эта функция требует небольшого значения delta
. Хорошим выбором для дельты является кубический корень машинного эпсилона [ необходима ссылка ] .
Тип функции d
указывает, что она отображает float
на другую функцию с этим типом . Это позволяет нам частично применять аргументы. Этот функциональный стиль известен как каррирование . В этом случае полезно частично применить первый аргумент к , чтобы получить более специализированную функцию:(float -> float) -> float -> float
delta
d
# let d = d ( sqrt epsilon_float ) ;; val d : ( float -> float ) -> float -> float = < веселье >
Обратите внимание, что предполагаемый тип указывает, что замена 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 = < веселье >
Понятия каррированных функций и функций высшего порядка явно полезны в математических программах. Фактически, эти концепции в равной степени применимы к большинству других форм программирования и могут использоваться для более агрессивного факторизации кода, что приводит к более коротким программам и меньшему количеству ошибок.
Дискретное вейвлет-преобразование (сопоставление с образцом)
1D Хаара вейвлета - преобразования из целого числа -степени-из-двух длин список номеров может быть реализован в очень кратко Ca и является отличным примером использования сопоставления с образцом по спискам, принимая пары элементов ( h1
а h2
) от переднего и сохраняя их суммы и разницы в списках s
и d
соответственно:
# let haar l = let rec aux l s d = сопоставить l , s , d с [ 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" в aux l [] [] ;; val haar : список int -> список int = < веселье >
Например:
# хаар [ 1 ; 2 ; 3 ; 4 ; - 4 ; - 3 ; - 2 ; - 1 ] ;; - : int list = [ 0 ; 20 ; 4 ; 4 ; - 1 ; - 1 ; - 1 ; - 1 ]
Сопоставление с образцом позволяет четко и лаконично представить сложные преобразования. Более того, компилятор Caml превращает сопоставление шаблонов в очень эффективный код, иногда приводя к программам, которые короче и быстрее, чем эквивалентный код, написанный с помощью оператора case (Cardelli 1984, стр. 210).
История
Первая реализация Caml была написана в Лиспе по Ascánder Суарес в 1987 году на французском Институте исследований в области вычислительной техники и автоматизации (INRIA). [2]
Его преемник, Caml Light , был реализован в C от Xavier Leroy и Дамьен Долигез , [2] и оригинальное прозвище «Heavy Caml» из - за его высоких требований к памяти и процессора. [2]
Caml Special Light был дальнейшим полным переписыванием, добавившим мощную модульную систему к основному языку. Он был дополнен объектным слоем и стал Objective Caml , впоследствии переименованным в OCaml .
Смотрите также
Рекомендации
Библиография
- Функциональный подход к программированию с помощью Caml Гая Кузино и Мишеля Мони.
- Карделли, Лука (1984). Составление функционального языка ACM Симпозиум по LISP и функциональному программированию , Ассоциация компьютерной техники.
Внешние ссылки
- Официальный сайт - языковая семья Caml