]]> ]]>
Править | Обсудить | История

ML

Дата создания:
1973
Создан под влиянием:
Повлиял на:
Парадигма:
Типизация:
Диалекты:
Реализации и версии (свернуть все | развернуть все):
Язык программирования

ML — функциональный язык программирования общего назначения, разработанный Робином Милнером (Robin Milner) и другими в поздних 1970-ых в Университете Эдинбурга; синтаксис этого языка создан под влиянием ISWIM.

Исторически ML расшифровывается как MetaLanguage (метаязык), т. к. он был использован для разработки тактики вывода автоматических доказательств теорем LCF (язык, для которого ML был метаязыком — pplambda, комбинация исчисления предикатов первого порядка и полиморфного λ-исчисления с простой типизацией).

Известен благодаря использованию алгоритма вывода типов Хиндли-Милнера (Hindley-Milner type inference algorithm), который может вычислять тип большинства значений без потребности в экстенсивной аннотации типов, часто критикуемой в таких языках, как Java.

Перечислим наиболее важные черты ML:

  • ML является функциональным языком программирования. Функции являются полноправными объектами: они могут передаваться в качестве аргументов, вырабатываться в качестве результата и храниться в переменных. Основной способ организации управления в программах на ML — рекурсивное применение функций
  • ML является интерактивным языком. Каждое введенное предложение анализируется, компилируется и исполняется, и значение, полученное в результате исполнения предложения, вместе с его типом выдается пользователю
  • ML является строго типизированным языком. Каждое допустимое выражение имеет тип, который автоматически определяется
  • ML имеет полиморфную систему типов. Каждое допустимое предложение языка обладает однозначно определяемой наиболее общей типизацией, которая определяет контексты, в которых предложение может быть использовано.
  • ML поддерживает абстрактные типы данных. Абстрактные типы весьма полезный механизм в модульном программировании. Новые типы данных могут быть определены вместе с набором операций над значениями этих типов
  • в ML области действия идентификаторов определяются статически. Смысл всех идентификаторов в программе определяется статически, что позволяет создавать более модульные и более эффективные программы
  • ML содержит надежно типизированный механизм обработки исключительных событий
  • ML содержит средства разбиения программ на модули, обеспечивающие возможность разработки больших программ по частям

Элементы синтаксиса:

Комментарии, которые не могут быть вложенными (* ... *)
Регистрозависимость да
Присваивание значения переменной :=
Сравнение < > <= >=
Последовательность ;
Если - то if (condition) then ...
Если - то - иначе if (condition) then ... else ...
Цикл с предусловием while (condition) do ...

IDE/Редакторы:

Примеры:

Hello, World!:

Пример для версий Objective Caml 3.10.2
print_endline "Hello, World!"

Hello, World!:

Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69

Отметим, что в Objective Caml этот код работать не будет, так как в нем не определена функция print.

print "Hello, World!\n";

Числа Фибоначчи:

Пример для версий Objective Caml 3.10.2

Используется рекурсивный метод вычисления чисел Фибоначчи.

let rec fibonacci n =
  if n < 3 then
    1
  else
    fibonacci (n-1) + fibonacci (n-2)

let () =
  for n = 1 to 16 do
    Printf.printf "%d, " (fibonacci n)
  done;
  print_endline "..."

Факториал:

Пример для версий Objective Caml 3.10.2

Используется рекурсивное определение факториала. Значения факториалов, начиная с 13!, отрицательны из-за переполнения:

12! = 479001600
13! = -215430144
14! = -868538368
15! = -143173632
16! = -143294464
let rec factorial n =
    if n <= 1 then
      1
    else
      factorial (n-1) * n;;

let () =
  for n = 0 to 16 do
    Printf.printf "%d! = %d\n" n (factorial n)
  done;

Факториал:

Пример для версий Objective Caml 3.10.2

В этом примере используется вспомогательная функция fact, позволяющая реализовать хвостовую рекурсию.

let rec fact n accum =
    if n <= 1 then 
        accum
    else
        fact (n-1) (accum*n);;

let factorial n =
    fact n 1;;

let () =
    for n = 0 to 16 do
        Printf.printf "%d! = %d\n" n (factorial n)
    done;

Факториал:

Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69

В примере используется рекурсивное определение факториала. ^ — оператор конкатенации строк; преобразование чисел в строки выполняется в явном виде. ;; в конце программы — сигнал для интерактивной среды, что блок программы дописан и может быть интерпретирован. Во всех реализациях возникает ошибка переполнения при вычислении 13!, и программа прерывается.

Отметим, что Int (библиотека для работы с целыми числами) входит в базовую библиотеку Standard ML, но SML/NJ и MLton подгружают ее автоматически, а Moscow ML — нет. Чтобы эта программа заработала в Moscow ML, ее следует запускать с опцией -P full.

fun factorial n =
  if n <= 0 then 1
  else n * factorial (n-1)

val n = ref 0;
while !n <= 16 do (
  print (Int.toString (!n) ^ "! = " ^ Int.toString (factorial (!n)) ^ "\n");
  n := !n + 1
);;

Числа Фибоначчи:

Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69

Используется итеративное определение чисел Фибоначчи.

val n = ref 0;
val fib0 = ref 1;
val fib1 = ref 1;
val sum = ref 0;
val res = ref "";
while !n <= 15 do (
  res := !res ^ (Int.toString(!fib0) ^ ", ");
  sum := !fib0 + !fib1;
  fib0 := !fib1;
  fib1 := !sum;
  n := !n + 1
);
print (!res ^ "...\n");;

CamelCase:

Пример для версий SML/NJ 110.69
val text = valOf (TextIO.inputLine TextIO.stdIn);
fun capitalize s = let
  val (x::xs) = explode s
in
  implode (Char.toUpper x :: map Char.toLower xs)
end;
val result = concat (map capitalize (String.tokens (not o Char.isAlpha) text));
print (result ^ "\n");

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам