Камл
Парадигма | Мультипарадигмальность : функциональная , императивная. |
---|---|
Семья | МЛ |
Разработано | Жерар Юэ , Ги Кузино, Аскандер Суарес, Пьер Вайс, Мишель Мони (Heavy Caml), Ксавье Лерой (Caml Light) |
Разработчик | ИНРИА , ЭНС |
Впервые появился | 1985 год |
Стабильная версия | 0.75 [1] / 26 января 2002 г |
Дисциплина набора текста | предполагаемый , статичный , сильный |
Управление памятью | автоматический |
ТЫ | Кроссплатформенность : Unix , Linux , macOS ; Окна |
Лицензия | QPL 1, LGPL 2 (Caml Light) |
Веб-сайт | камл |
Под влиянием | |
МЛ | |
Под влиянием | |
OCaml |
Caml (первоначально аббревиатура от Categorical Abstract Machine Language ) — это многопарадигмальный , общего назначения , высокоуровневый , функциональный язык программирования который является диалектом ML семейства языков программирования . Caml был разработан во Франции во Французском институте исследований в области компьютерных наук и автоматизации (INRIA) и Высшей нормальной школе (Париж) (ENS).
Caml статически типизирован , строго оценивается и использует автоматическое управление памятью . OCaml , основной потомок Caml, добавляет в язык множество функций, включая уровень объектно-ориентированного программирования (объектный).
Примеры [ править ]
В следующих, #
представляет приглашение Caml.
Привет, мир [ править ]
« Привет, мир!» программа это:
print_endline "Привет, мир!" ;;
Функция факториала (рекурсия и чисто функциональное программирование) [ править ]
Многие математические функции, например факториал, наиболее естественно представить в чисто функциональной форме. Следующая рекурсивная чисто функциональная функция Caml реализует факториал:
let Rec fact n = если n = 0, то 1 else n * fact ( n - 1 );;
Функцию можно записать эквивалентно, используя сопоставление с образцом :
пусть запись факта = функция
| 0 -> 1
| n -> n * факт ( n - 1 );;
Эта последняя форма представляет собой математическое определение факториала как рекуррентного отношения.
Обратите внимание, что компилятор определил тип этой функции как int -> int
, что означает, что эта функция отображает целые числа на целые. Например, 12! является:
# факт 12 ;;
- : интервал = 479001600
Числовая производная (функции высшего порядка) [ править ]
Поскольку Caml является функциональным языком программирования , в программах Caml легко создавать и передавать функции. Эта способность имеет очень много применений. Одним из примеров является вычисление числовой производной функции. Следующая функция Caml d
вычисляет числовую производную заданной функции f
в данный момент x
:
пусть d дельта f x =
( f ( x + дельта ) - е - дельта ( x ) ) / . ( 2 . *. дельта );;
Эта функция требует небольшого значения delta
. Хорошим выбором для дельты является кубический корень из машинного эпсилона . [ нужна цитата ] .
Тип функции d
указывает на то, что он отображает float
на другую функцию типа (float -> float) -> float -> float
. Это позволяет нам частично применять аргументы. Этот функциональный стиль известен как каррирование . В этом случае полезно частично применить первый аргумент delta
к d
, чтобы получить более специализированную функцию:
# let d = d ( sqrt epsilon_float );;
val d : ( float -> ) - > float - float = <fun> > float
Обратите внимание, что выведенный тип указывает, что замена d
ожидает функцию типа float -> float
в качестве первого аргумента. Мы можем вычислить численное приближение к производной в с:
# d ( fun x -> x *. x *. x -. x -. 1 .) 3 .;;
- : плавающее = 26 .
Правильный ответ .
Функция d
называется « функцией высшего порядка », поскольку она принимает другую функцию ( f
) в качестве аргумента.
Двигаясь дальше, можно создать (приблизительную) производную от f, применив d
опуская при этом x
аргумент:
# let f' = d ( fun x -> x *. x *. x -. x -. 1 .) ;;
val ' : float - float = <fun> f >
Понятия каррирования и функций высшего порядка явно полезны в математических программах. Эти концепции в равной степени применимы к большинству других форм программирования и могут использоваться для более агрессивной факторизации кода, что приводит к сокращению программ и меньшему количеству ошибок.
Дискретное вейвлет-преобразование (сопоставление с образцом) [ править ]
Одномерное вейвлет- преобразование Хаара для целочисленного списка чисел длиной в степени двойки может быть очень лаконично реализовано в Caml и является отличным примером использования сопоставления с образцом в списках, берущих пары элементов ( 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 )
| _ -> инвалид_арг "хаар"
в aux l [] [] ;;
val haar : int list > int list = <fun> -
Например:
# волосы [ 1 ; 2 ; 3 ; 4 ; -4 ; - 3 ; -2 ; - 1 ];;
- : int список = [ 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 и функциональному программированию , Ассоциация компьютерной техники.
Внешние ссылки [ править ]
- Официальный сайт ИНРИА