ML
- Дата создания:
- 1973
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Диалекты:
- Реализации и версии (свернуть все | развернуть все):
-
- Caml Light
- Caml Special Light
- Dependent ML
- Edinburgh ML
- Extended ML
- GAML
- HaMLet
- HaMLet S
- Heavy CAML
- Lazy ML
- ML Kit
- MLj
- MLton
- MOSCOW ML
- MicroML
-
Objective CAML
- Objective Caml 1.00
- Objective Caml 1.01
- Objective Caml 1.02
- Objective Caml 1.03
- Objective Caml 1.04
- Objective Caml 1.05
- Objective Caml 1.06
- Objective Caml 1.07
- Objective Caml 2.00
- Objective Caml 2.01
- Objective Caml 2.02
- Objective Caml 2.03
- Objective Caml 2.04
- Objective Caml 3.00
- Objective Caml 3.01
- Objective Caml 3.02
- Objective Caml 3.03 ALPHA
- Objective Caml 3.04
- Objective Caml 3.05
- Objective Caml 3.06
- Objective Caml 3.07
- Objective Caml 3.08.0
- Objective Caml 3.08.1
- Objective Caml 3.08.2
- Objective Caml 3.08.3
- Objective Caml 3.08.4
- Objective Caml 3.09.0
- Objective Caml 3.09.1
- Objective Caml 3.09.2
- Objective Caml 3.09.3
- Objective Caml 3.10.0
- Objective Caml 3.10.2
- Poly/ML
- SML#
- SML.NET
-
SML/NJ
- SML/NJ 110.41
- SML/NJ 110.43
- SML/NJ 110.40
- SML/NJ 110.42
- SML/NJ 110.44
- SML/NJ 110.45
- SML/NJ 110.46
- SML/NJ 110.47
- SML/NJ 110.48
- SML/NJ 110.49
- SML/NJ 110.50
- SML/NJ 110.51
- SML/NJ 110.52
- SML/NJ 110.53
- SML/NJ 110.54
- SML/NJ 110.55
- SML/NJ 110.56
- SML/NJ 110.57
- SML/NJ 110.58
- SML/NJ 110.59
- SML/NJ 110.60
- SML/NJ 110.61
- SML/NJ 110.62
- SML/NJ 110.63
- SML/NJ 110.63.1
- SML/NJ 110.63.2
- SML/NJ 110.64
- SML/NJ 110.65
- SML/NJ 110.69
- SMLtoJs
- Successor ML
- TILT
- sml2c
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.2print_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.69val 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
]]>