Синтаксис языка OCAML Числа Целые Вещественные Целочисленные операции Операции с вещественными числами +-*/ +. -. *. /. Автоматическое приведение целых чисел к вещественным не производится Вызов функции («аппликация») Все функции – каррированные В матанализе: f ( x, y ) В OCAML: ( f x y) Библиотечные функции распределены по модулям Printf.printf List.rev Ряд функций доступен в глобальном пространстве имен: float_of_int int_of_string Строки В некоторых функц. языках строки реализованы как списки символов (character); символ – один из базовых типов. В OCAML строка – базовый тип. Над строками определены операции Конкатенация Вырезка … Для изображения строки-литерала используются двойные кавычки “This is some string” Ключевое слово let На верхнем уровне модуля: let <имя> = <значение>;; В теле функции: let <имя> = <значение> in <выражение> Списки Список в литеральной форме: Конструирование списка из головы и хвоста: v1::v2 Пустой список [v1; v2; … vn] [] Литеральная форма эквивалентна v1::v2:: … ::vn::[] Функции; рекурсивные функции Функция – объект программы Лямбда-выражение, лямбда-функция function <имя> -> <тело> Можно связать с переменной fun имя1 имя2 … имяN -> тело Специальная форма директивы let: let f = function x -> x + 1 Сокращенная форма для каррированной лямбда-функции: function x -> x + 1 let имя_функции имя1 имя2 … имяN = тело Директива let для рекурсивных функций: let rec имя_функции имя1 имя2 … имяN = тело Сопоставление с образцом match выражение with клоз1 | клоз2 | … | клозN Можно ставить | и сразу после with (для красоты). (Англ: pattern matching) Клоз: образец -> тело Образец – структурное выражение, (обычно) содержащее переменные Сопоставление определяется индуктивно: Простые объекты проверяются на совпадение Переменная при первом вхождении связывается со значением; при последующем проверяется на совпадение Структура выражения должна совпадать. Пример; Анонимная переменная match 1::2::3::[] with | [] -> “пусто!” | v1::v2::v3::_ -> “список как минимум из 3x эл. “ | v1::v2 -> “непустой список!” Анонимная переменная _ связывается со значением как и обычная переменная. Каждое вхождение _ в образец задает новую анонимную переменную, отличную от остальных. Сопоставление значений, присвоенных анонимным переменным, никогда не производится. Присвоенные значения «забываются». | _::_::_::_ -> “список как минимум из 3x эл. “ Лямбда-функция и сопоставление с образцом Еще одна «избыточность» синтаксиса OCAML: Можно записывать как function x -> match x with список_клозов function список_клозов Пример: function 1 -> “one” | 2 -> “two” | 3 -> “too much” Программирование с использованием рекурсивных функций Прием: накапливающий аргумент Функция sumlist реализована через вспомогательную функцию suml2. В suml2 использован накапливающий аргумент. В нем хранится текущее значение суммы.