Jump to content

Камл

(Перенаправлено с CaML )

Камл
Парадигма Мультипарадигмальность : функциональная , императивная.
Семья МЛ
Разработано Жерар Юэ , Ги Кузино, Аскандер Суарес, Пьер Вайс, Мишель Мони (Heavy Caml), Ксавье Лерой (Caml Light)
Разработчик ИНРИА , ЭНС
Впервые появился 1985 год ; 39 лет назад ( 1985 )
Стабильная версия
0.75 [1] / 26 января 2002 г .; 22 года назад ( 26 января 2002 г. )
Дисциплина набора текста предполагаемый , статичный , сильный
Управление памятью автоматический
ТЫ Кроссплатформенность : Unix , Linux , macOS ; Окна
Лицензия QPL 1, LGPL 2 (Верблюжий свет)
Веб-сайт камл .инрия .fr
Под влиянием
МЛ
Под влиянием
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 .

См. также

[ редактировать ]
  1. ^ «Последний выпуск Caml Light» . Проверено 22 февраля 2020 г. .
  2. ^ Перейти обратно: а б с «История Caml» , inria.fr

Библиография

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3da876fcb6b66e68e5d8fb10698f6e79__1715929380
URL1:https://arc.ask3.ru/arc/aa/3d/79/3da876fcb6b66e68e5d8fb10698f6e79.html
Заголовок, (Title) документа по адресу, URL1:
Caml - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)