~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 5286E09120DCDF42DD935BBF722EA684__1718233260 ✰
Заголовок документа оригинал.:
✰ Standard ML - Wikipedia ✰
Заголовок документа перевод.:
✰ Стандартное машинное обучение — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Standard_ML ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/52/84/5286e09120dcdf42dd935bbf722ea684.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/52/84/5286e09120dcdf42dd935bbf722ea684__translat.html ✰
Дата и время сохранения документа:
✰ 16.06.2024 09:22:50 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 13 June 2024, at 02:01 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Стандартное машинное обучение — Википедия Jump to content

Стандартный ML

Из Википедии, бесплатной энциклопедии
Стандартный ML
Парадигма Мультипарадигмальность : функциональная , императивная , модульная. [1]
Семья МЛ
Впервые появился 1983 год ; 41 год назад ( 1983 ) [2]
Стабильная версия
Стандартный ML '97 [2] / 1997 ; 27 лет назад ( 1997 )
Дисциплина набора текста Предполагаемый , статичный , сильный
Расширения имен файлов .sml
Веб-сайт смлсемья .github .что
Основные реализации
СМЛ/Нью-Джерси , MLton , Поли/ML
Диалекты
Алиса , Параллельное ML , Зависимое ML
Под влиянием
МЛ , Хоуп , Паскаль
Под влиянием
Elm , F# , F* , Haskell , OCaml , Python , [3] Ржавчина , [4] Скала

Standard ML ( SML ) — это назначения высокого уровня с модульный функциональный общего язык программирования во время компиляции проверкой типов и выводом типов . Он популярен при написании компиляторов , при исследовании языков программирования и при разработке средств доказательства теорем .

Стандартный ML — это современный диалект ML , языка, используемого в Логика для вычислимых функций» проекте доказательства теорем « (LCF). Среди широко используемых языков он отличается тем, что имеет формальную спецификацию , представленную в виде правил типизации и операционной семантики в «Определении стандартного машинного обучения» . [5]

Язык [ править ]

Стандартный ML — это функциональный язык программирования с некоторыми нечистыми функциями. Программы, написанные на стандартном ML, состоят из выражений, в отличие от операторов или команд, хотя некоторые выражения типа unit оцениваются только на предмет их побочных эффектов .

Функции [ править ]

Как и во всех функциональных языках, ключевой особенностью Standard ML является функция , которая используется для абстракции. Факториал можно выразить следующим образом:

весело   факториал   n   =  
     если   n   =   0   , то   1   иначе   n   *   факториал   (  n   -   1  ) 

Вывод типа [ править ]

Компилятор SML должен определить статический тип. val factorial : int -> intбез предоставленных пользователем аннотаций типов. Это должно сделать вывод n используется только с целочисленными выражениями и, следовательно, само должно быть целым числом, а все терминальные выражения являются целочисленными выражениями.

определения Декларативные

Та же самая функция может быть выражена с помощью определений клаузальных функций , где условие if - then - else заменяется шаблонами факториальной функции, вычисляемой для определенных значений:

забавный   факториал   0   =   1 
   |    факториал   n   =   n   *   факториал   (  n   -   1  ) 

Определения императива [ править ]

или итеративно:

fun   факториал   n   =   let   val   i   =   ref   n   и   acc   =   ref   1   in 
     while   !i   >   0   do   (  acc   :=   !acc   *   !i  ;   i   :=   !i   -   1  );    !акк 
 конец 

Лямбда-функции [ править ]

или как лямбда-функция:

val   Rec   Factorial   =   fn   0   =>   1   |    n   =>   n   *   факториал   (  n   -   1  ) 

Здесь ключевое слово val вводит привязку идентификатора к значению, fn вводит анонимную функцию и rec позволяет определению быть самореферентным.

Местные определения [ править ]

Инкапсуляция сохраняющего инвариант жесткого цикла хвостовой рекурсии с одним или несколькими параметрами аккумулятора внутри безинвариантной внешней функции, как показано здесь, является распространенной идиомой в стандартном машинном обучении.

Используя локальную функцию, ее можно переписать в более эффективном стиле хвостовой рекурсии:

локальный 
     веселья   цикл   (  0  ,   акк  )   =   акк 
       |    цикл   (  m  ,   Acc  )   =   цикл   (  m   -   1  ,   m   *   Acc  ) 
 в 
     веселья   факториале   n   =   цикл   (  n  ,   1  ) 
 конец 

Введите синонимы [ править ]

Синоним типа определяется ключевым словом type. Вот синоним типа для точек на плоскости и функции, вычисляющие расстояния между двумя точками и площадь треугольника с заданными углами по формуле Герона . (Эти определения будут использоваться в последующих примерах).

type   loc   =   Real   *   Real 

 fun   Square   (  x   :   Real  )   =   x   *   x 

 fun   dist   (  x  ,   y  )   (  x'  ,   y'  )   = 
     Math  .   sqrt   (  квадрат   (  x'   -   x  )   +   квадрат   (  y'   -   y  )) 

 fun   цапля   (  a  ,   b  ,   c  )   =   let 
     val   x   =   dist   a   b 
     val   y   =   dist   b   c 
     val   z   =   dist   a   c 
     val   s   =   (  x   +   y   +   z  )   /   2.0 
     по 
         математике  .   sqrt   (  s   *   (  s   -   x  )   *   (  s   -   y  )   *   (  s   -   z  )) 
     конец 

Алгебраические типы данных [ править ]

Стандартный ML обеспечивает надежную поддержку алгебраических типов данных (ADT). Тип данных можно рассматривать как несвязное объединение кортежей (или «сумму произведений»). Их легко определить и легко использовать, в основном благодаря сопоставлению с образцом в большинстве стандартных реализаций ML , а также проверке полноты шаблонов и проверке избыточности шаблонов .

В объектно-ориентированных языках программирования несвязное объединение может быть выражено в виде классов иерархии . Однако, в отличие от иерархий классов , ADT закрыты . Таким образом, расширяемость АТД ортогональна расширяемости иерархий классов. Иерархии классов могут быть расширены новыми подклассами, реализующими тот же интерфейс, а функции АТД могут быть расширены для фиксированного набора конструкторов. См. проблему с выражением .

Тип данных определяется ключевым словом datatype, как в:

тип данных   shape 
     =   Круг     loc   *   real   (        * центр и радиус *) 
     |    Квадрат     loc   real   *   )        (* верхний левый угол и длина стороны; выровнено по оси * 
     |    Треугольник   loc   loc   *   loc   *   (* углы   *) 

Обратите внимание, что синоним типа не может быть рекурсивным; типы данных необходимы для определения рекурсивных конструкторов. (В данном примере это не обсуждается.)

Сопоставление с образцом [ править ]

Шаблоны сопоставляются в том порядке, в котором они определены. на C Программисты могут использовать тегированные объединения , диспетчеризируя значения тегов, чтобы делать то, что ML делает с типами данных и сопоставлением с образцом. Тем не менее, хотя программа C, оснащенная соответствующими проверками, в некотором смысле будет такой же надежной, как и соответствующая программа ML, эти проверки обязательно будут динамическими; ML Статические проверки обеспечивают надежную гарантию корректности программы во время компиляции.

Аргументы функции можно определить как шаблоны следующим образом:

 развлечений  зона   (  Круг   (_,   r  ))   =   Math  .   пи   *   квадрат   r 
   |    площадь   (  Квадрат   (_,   с  ))   =   квадрат   с 
   |    площадь   (  Треугольник   p  )   =   цапли   p   (*см. выше *) 

Так называемая «клаузальная форма» определения функции, в которой аргументы определяются как шаблоны, является просто синтаксическим сахаром для регистрового выражения:

 забавной   области  Форма   =   корпуса   форма   Circle 
     (   _,   r  )   =>   Math  .   пи   *   квадрат   r 
   |    Квадрат   (_,   s  )   =>   квадрат   s 
   |    Треугольник   p   =>   цапля   p 

Проверка полноты [ править ]

Проверка полноты шаблонов гарантирует, что каждому конструктору типа данных соответствует хотя бы один шаблон.

Следующий шаблон не является исчерпывающим:

 развлечений  центр   (  Круг   (  c  ,   _))   =   c 
   |    центр   (  Квадрат   ((  x  ,   y  ),   s  ))   =   (  x   +   s   /   2,0  ,   y   +   s   /   2,0  ) 

Не существует шаблона для Triangle дело в centerфункция. Компилятор выдаст предупреждение о том, что выражение case не является исчерпывающим, и если Triangle передается этой функции во время выполнения, exception Match будет повышен.

Проверка избыточности [ править ]

Шаблон во втором предложении следующей (бессмысленной) функции является избыточным:

весело   ж   (  Круг   ((  Икс  ,   y  ),   р  ))   знак равно   Икс   +   y 
   |    ж   (  Круг   _)   =   1,0 
   |    ж   _   =   0,0 

Любое значение, соответствующее шаблону во втором предложении, будет также соответствовать шаблону в первом предложении, поэтому второе предложение недостижимо. Таким образом, это определение в целом демонстрирует избыточность и вызывает предупреждение во время компиляции.

Следующее определение функции является исчерпывающим и не является избыточным:

val   hasCorners   =   fn   (  Circle   _)   =>   false   |    _   =>   правда 

Если управление проходит первый шаблон ( Circle), мы знаем, что форма должна быть либо Square или Triangle. В любом из этих случаев мы знаем, что у фигуры есть углы, поэтому мы можем вернуться true не различая фактической формы.

Функции высшего порядка [ править ]

Функции могут использовать функции в качестве аргументов:

забавная   карта   ж   (  Икс  ,   y  )   знак равно   (  ж   Икс  ,   ж   y  ) 

Функции могут создавать функции как возвращаемые значения:

 веселья  константа   k   =   (  fn   _   =>   k  ) 

Функции также могут как потреблять, так и производить функции:

весело   сочинять   (  ж  ,   г  )   =   (  fn   x   =>   ж   (  г   Икс  )) 

Функция List.map из базовой библиотеки — одна из наиболее часто используемых функций высшего порядка в Standard ML:

забавная   карта   _   []   =   [] 
   |    карта   f   (  x   ::   xs  )   =   f   x   ::   карта   f   xs 

Более эффективная реализация с хвостовой рекурсией List.foldl:

забавная   карта   f   =   Список  .   ред.   о   Список  .   foldl   (  fn   (  x  ,   акк  )   =>   ж   x   ​​::   акк  )   [] 

Исключения [ править ]

Исключения возникают с помощью ключевого слова raise и обрабатывается с помощью сопоставления с образцом handleпостроить. Система исключений может реализовать нелокальный выход ; этот метод оптимизации подходит для таких функций, как следующие.

локальное 
     исключение   Zero  ; 
      val   p   =   fn   (  0  ,   _)   =>   поднять   ноль   |    (  a  ,   b  )   =>   a   *   b 
 в 
     fun   prod   xs   =   List  .   foldl   p   1   xs   дескриптор   Ноль   =>   0 
 конец 

Когда exception Zero поднимается, управление выходит из функции List.foldlвообще. Рассмотрим альтернативу: будет возвращено значение 0, оно будет умножено на следующее целое число в списке, будет возвращено полученное значение (неизбежно 0) и так далее. Вызов исключения позволяет элементу управления пропустить всю цепочку кадров и избежать связанных с ней вычислений. Обратите внимание на использование подчеркивания ( _) как шаблон подстановочного знака.

Ту же самую оптимизацию можно получить с помощью хвостового вызова .

локальное 
     развлечение   p   a   (  0   ::   _)   =   0 
       |    п   а   (  Икс   ::   xs  )   знак равно   п   (  a   *   x  )   xs 
       |    p   a   []   =   a 
 in 
     val   prod   =   p   1 
 end 

Система модулей [ править ]

Расширенная система модулей Standard ML позволяет разлагать программы на иерархически организованные структуры логически связанных типов и определений значений. Модули обеспечивают не только управление пространством имен , но и абстракцию в том смысле, что они позволяют определять абстрактные типы данных . Систему модулей составляют три основные синтаксические конструкции: сигнатуры, структуры и функторы.

Подписи [ править ]

Сигнатура , который — это интерфейс обычно рассматривается как тип структуры; он определяет имена всех сущностей, предоставляемых структурой, арность каждого компонента типа, тип каждого компонента значения и сигнатуру каждой подструктуры. Определения компонентов типа не являются обязательными; Компоненты типа, определения которых скрыты, являются абстрактными типами .

Например, подпись для очереди может быть следующей:

подпись   QUEUE   =   подписи 
     тип   '   очереди 
     исключение   QueueError  ; 
      val   пустой       :   '   очередь 
     val   isEmpty     :   '   очередь   ->   bool 
     val   Singleton   :   'a   ->   '   очередь 
     val   fromList    :   'a   list   ->   '   очередь 
     val   вставка      :   'a   *   '   очередь   ->   '   очередь 
     val   peek        :   'a   Queue   ->   'a 
     val   Remove      :   'a   Queue   ->   'a   *   '   очереди 
 Конец 

Эта сигнатура описывает модуль, предоставляющий полиморфный тип. 'a queue, exception QueueErrorи значения, определяющие основные операции с очередями.

Структуры [ править ]

Структура это модуль; он состоит из набора типов, исключений, значений и структур (называемых подструктурами ), упакованных вместе в логическую единицу.

Структуру очереди можно реализовать следующим образом:

структура   TwoListQueue   :>   QUEUE   =   struct 
     type   'a   Queue   =   'a   list   *   '   списка 

     исключение   QueueError  ; 

      val   пустой   =   ([],   []) 

     fun   isEmpty   ([],   [])   =   true 
       |    isEmpty   _   =   false 

     fun   синглтон   a   =   ([],   [  a  ]) 

     fun   fromList   a   =   ([],   a  ) 

     fun   Insert   (  a  ,   ([],   []))   =   синглтон   a 
       |    вставить   (  a  ,   (  ins  ,   outs  ))   =   (  a   ::   ins  ,   outs  ) 

     fun   peek   (_,   [])   =   поднять   QueueError 
       |    peek   (  входы  ,   выходы  )   =   Список  .   hd   outs 

     fun   удалить   (_,   [])   =   поднять   QueueError 
       |    удалить   (  ins  ,   [  a  ])   =   (  a  ,   ([],   List  .  rev   ins  )) 
       |    удалить   (  входы  ,   а   ::   выходы  )   =   (  а  ,   (  входы  ,   выходы  )) 
 конец 

Это определение заявляет, что structure TwoListQueue реализует signature QUEUE. Кроме того, непрозрачное приписывание, обозначаемое :> утверждает, что любые типы, которые не определены в сигнатуре (т.е. type 'a queue) должен быть абстрактным, то есть определение очереди как пары списков не видно за пределами модуля. Структура реализует все определения в сигнатуре.

Доступ к типам и значениям в структуре можно получить с помощью «точечной записи»:

val   q   :   строка   TwoListQueue  .   очередь   =   TwoListQueue  .   пустой 
 val   q'   =   TwoListQueue  .   вставить   (  Real  .  toString   Math  .  pi  ,   q  ) 

Функторы [ править ]

Функтор — это функция от структуры к структуре; то есть функтор принимает один или несколько аргументов, которые обычно являются структурами заданной сигнатуры, и в качестве результата создает структуру. Функторы используются для реализации общих структур данных и алгоритмов.

Один популярный алгоритм [6] для поиска деревьев в ширину используются очереди. Вот версия этого алгоритма, параметризованная в абстрактной структуре очереди:

(* по Окасаки, ICFP, 2000 *) 
 функтор   BFS   (  Q  :   QUEUE  )   =   struct 
   datatype   'a   Tree   =   E   |    T   of   'a   *   '   дерево   *   '   дерево 

   локальной 
     забавы   bfsQ   q   =   if   Q  .   isEmpty   q   then   []   else   поиск   (  Q  .  удалить   q  ) 
     и   поиск   (  E  ,   q  )   =   bfsQ   q 
       |    найдите   (  T   (  x  ,   l  ,   r  ),   q  )   =   x   ::   bfsQ   (  вставьте   (  вставьте   q   l  )   r  ) 
     и   вставьте   q   a   =   Q  .   вставить   (  a  ,   q  ) 
   в 
     fun   bfs   t   =   bfsQ   (  Q  .  singleton   t  ) 
   конец 


 структура   QueueBFS   =   BFS   (  TwoListQueue  ) 

В пределах functor BFS, представление очереди не видно. Более конкретно, невозможно выбрать первый список в очереди из двух списков, если это действительно используемое представление. Этот механизм абстракции данных делает поиск в ширину действительно независимым от реализации очереди. В целом это желательно; в этом случае структура очереди может безопасно поддерживать любые логические инварианты, от которых зависит ее корректность, за пуленепробиваемой стеной абстракции.

Примеры кода [ править ]

Фрагменты кода SML легче всего изучать, вводя их в интерактивный файл .

Привет, мир! [ редактировать ]

Далее следует «Привет, мир!» программа :

привет.sml
print   "Привет, мир!  \n  "  ; 
бить
$  млтон   hello.sml 
  $  ./привет 
  Привет, мир! 

Алгоритмы [ править ]

Сортировка вставками [ править ]

Сортировка вставкой для int list (по возрастанию) можно кратко выразить следующим образом:

забавная   вставка   (  x  ,   [])   =   [  x  ]   |    вставить   (  x  ,   h   ::   t  )   =   sort   x   (  h  ,   t  ) 
 и   sort   x   (  h  ,   t  )   =   if   x   <   h   then   [  x  ,   h  ]   @   t   else   h   ::   Insert   (  x  ,   t  ) 
 val   Insertionsort   =   Список  .   сложить   вставку   [] 

Сортировка слиянием [ править ]

Здесь классический алгоритм сортировки слиянием реализован в трех функциях: разделение, слияние и сортировка слиянием. Также обратите внимание на отсутствие типов, за исключением синтаксиса op :: и []которые обозначают списки. Этот код будет сортировать списки любого типа при условии, что функция упорядочивания будет последовательной. cmpопределено. Используя вывод типа Хиндли-Милнера , можно вывести типы всех переменных, даже таких сложных типов, как тип функции. cmp.

Расколоть

fun split реализуется с замыканием с отслеживанием состояния , которое чередуется между true и false, игнорируя ввод:

fun   alternator   {}   =   let   val   state   =   ref   true 
     in   fn   a   =>   !state   before   state   :=   not   (  !state  )   end 

 (* Разделить список на почти половинки, которые либо будут одинаковой длины, 
 * либо первая будет иметь на один элемент больше, чем другой. 
 * Выполняется за время O(n), где n = |xs| 
 *) 
 fun   Split   xs   =   List  .   раздел   (  генератор   {})   xs 

Объединить

Для повышения эффективности слияние использует локальный функциональный цикл. Внутренний loop определяется в терминах случаев: когда оба списка непусты ( x :: xs) и когда один список пуст ( []).

Эта функция объединяет два отсортированных списка в один. Обратите внимание, как аккумулятор accстроится задом наперед, а затем переворачивается перед возвратом. Это распространенный метод, поскольку 'a listпредставляется в виде связанного списка ; этот метод требует больше тактового времени, но асимптотика не хуже.

(* Объединить два упорядоченных списка, используя порядок cmp. 
 * Предварительно: каждый список уже должен быть упорядочен для каждого cmp. 
 * Выполняется за время O(n), где n = |xs| + |ys|. 
 *) 
 fun   merge   cmp   (  xs  ,   [])   =   хз 
   |    объединить   cmp   (  xs  ,   y   ::   ys  )   =   let 
     fun   Loop   (  a  ,   acc  )   (  xs  ,   [])   =   List  .   revAppend   (  a   ::   acc  ,   xs  ) 
       |    цикл   (  a  ,   acc  )   (  xs  ,   y   ::   ys  )   = 
         if   cmp   (  a  ,   y  ) 
         then   цикл   (  y  ,   a   ::   acc  )   (  ys  ,   xs  ) 
         else   цикл   (  a  ,   y   ::   acc  )   (  xs  ,   ys  ) 
     в 
         цикле   (  y  ,   [])   (  ys  ,   xs  ) 
     конец 

Сортировка слиянием

Основная функция:

fun   ap   f   (  x  ,   y  )   =   (  f   x  ,   f   y  ) 

 (* Сортировка списка в соответствии с заданной операцией упорядочивания cmp. 
 * Выполняется за время O(n log n), где n = |xs|. 
 *) 
 весело   слиянием   cmp   []   =   [] 
   |    сортировка слиянием   cmp   [  x  ]   =   [  x  ] 
   |    mergesort   cmp   xs   =   (  merge   cmp   o   ap   (  mergesort   cmp  )   o   Split  )   xs 

Быстрая сортировка [ править ]

Быструю сортировку можно выразить следующим образом. fun part это замыкание , которое использует оператор заказа op <<.

infix   << 

 fun   fastsort   (  op   <<  )   =   let 
     fun   part   p   =   List  .   раздел   (  fn   x   =>   x   <<   p  ) 
     fun   sort   []   =   [] 
       |    sort   (  p   ::   xs  )   =   join   p   (  часть   p   xs  ) 
     и   join   p   (  l  ,   r  )   =   sort   l   @   p   ::   sort   r 
     в 
         сортировки 
     конце 

Интерпретатор выражений [ править ]

Обратите внимание на относительную легкость, с которой можно определить и обработать небольшой язык выражений:

исключение   TyErr  ; 

  тип данных   ty   =   IntTy   |    BoolTy 

 fun   unify   (  IntTy  ,   IntTy  )   =   IntTy 
   |    унифицировать   (  BoolTy  ,   BoolTy  )   =   BoolTy 
   |    унифицировать   (_,   _)   =   повысить   TyErr 

 тип данных   exp 
     =   True 
     |    Ложь 
     |    Int   из   int 
     |    Не   опыта  
     |    Добавление   опыта    *   exp 
     |    Если    exp   exp   *   ,   *   exp 

 fun   выводится   True   =   BoolTy 
   |    сделать вывод   Ложь   =   BoolTy 
   |    вывести   (  Int   _)   =   IntTy 
   |    вывести   (  Не   е  )   =   (  утверждать   е   BoolTy  ;   BoolTy  ) 
   |    вывести   (  Add   (  a  ,   b  ))   =   (  утвердить   a   IntTy  ;   утвердить   b   IntTy  ;   IntTy  ) 
   |    вывести   (  If   (  e  ,   t  ,   f  ))   =   (  утвердить   e   BoolTy  ;   объединить   (  вывести   t  ,   вывести   f  )) 
 и   утвердить   e   t   =   унифицировать   (  вывести   e  ,   t  ) 

 fun   eval   True   =   True 
   |    оценка   Ложь   =   Ложь 
   |    оценка   (  Int   n  )   =   Int   n 
   |    eval   (  Not   e  )   =   если   eval   e   =   True   , то   False   , иначе   True 
   |    eval   (  Add   (  a  ,   b  ))   =   (  случай   (  eval   a  ,   eval   b  )   of   (  Int   x  ,   Int   y  )   =>   Int   (  x   +   y  )) 
   |    eval   (  If   (  e  ,   t  ,   f  ))   =   eval   (  если   eval   e   =   True   , то   t   else   f  ) 

 fun   run   e   =   (  infer   e  ;   SOME   (  eval   e  ))   handle   TyErr   =>   NONE 

Пример использования правильно типизированных и неправильно типизированных выражений:

val   SOME   (  Int   3  )   =   run   (  Add   (  Int   1  ,   Int   2  ))   (* правильно типизированный *) 
 val   NONE   =   run   (  If   (  Not   (  Int   1  ),   True  ,   False  ))   (* неправильно типизированный *) 

Целые числа произвольной точности [ править ]

The IntInfМодуль обеспечивает целочисленную арифметику произвольной точности. Более того, целочисленные литералы могут использоваться как целые числа произвольной точности без необходимости каких-либо действий программиста.

Следующая программа реализует функцию факториала произвольной точности:

факт.sml
интересный   факт   :    IntInf  .   int   =   если   n   =   0,   то   1   иначе   n   *   факт   (  n   -   1  ); 

  весело   printLine   str   =   TextIO  .   вывод   (  TextIO  .  stdOut  ,   str   ^   "  \n  "  ); 

  val   )   =   printLine   (  IntInf.toString  120  факт   (  )   (  ); 
бить
$  млтон   факт.sml 
  $  ./факт 
  6689502913449127057588118054090372586752746333138029810295671352301 
 633557244962989366874165271984981308157637893214090552 
 5344085894081 21859898481114389650005964960521256960000000000000000000000000000 

Частичное применение [ править ]

Каррированные функции имеют множество применений, например, для устранения избыточного кода. Например, модулю могут потребоваться функции типа a -> b, но удобнее писать функции типа a * c -> b где существует фиксированная связь между объектами типа a и c. Функция типа c -> (a * c -> b) -> a -> bможно исключить эту общность. Это пример шаблона адаптера . [ нужна цитата ]

В этом примере fun d вычисляет числовую производную заданной функции f в точку x:

-   fun   d   delta   f   x   =   (  f   (  x   +   delta  )   -   f   (  x   -   delta  ))   /   (  2,0   *   delta  ) 
 val   d   =   fn   :   реальный   ->   (  реальный   ->   реальный  )   ->   реальный   ->   реальный 

Тип fun d указывает, что он отображает «плавающее число» на функцию типа (real -> real) -> real -> real. Это позволяет нам частично применять аргументы, известные как каррирование . В этом случае функция d можно специализировать, частично применив его с аргументом delta. Хороший выбор для delta при использовании этого алгоритма это кубический корень из машинного эпсилона . [ нужна цитата ]

-   val   d'   =   d   1E~8  ; 
  val   d'   =   fn   :   (  реальный   ->   реальный  )   ->   реальный   ->   реальный 

Выведенный тип указывает на то, что d' ожидает функцию типа real -> realв качестве первого аргумента. Мы можем вычислить приближение к производной в . Правильный ответ .

-   d'   (  fn   x   =>   x   *   x   *   x   -   x   -   1,0  )   3,0  ; 
  val   it   =   25,9999996644   :   реальный 

Библиотеки [ править ]

Стандартный [ править ]

Базовая библиотека [7] был стандартизирован и поставляется с большинством реализаций. Он предоставляет модули для деревьев, массивов и других структур данных, а также интерфейсы ввода/вывода и системные интерфейсы.

Третья сторона [ править ]

Для числовых вычислений существует модуль Matrix (но в настоящее время он не работает) https://www.cs.cmu.edu/afs/cs/project/pscico/pscico/src/matrix/README.html .

Что касается графики, cairo-sml — это интерфейс с открытым исходным кодом для графической библиотеки Cairo . Для машинного обучения существует библиотека графических моделей.

Реализации [ править ]

Реализации Standard ML включают следующее:

Стандартный

Производная

Исследовать

  • CakeML — это REPL-версия ML с формально проверенной средой выполнения и переводом на ассемблер.
  • Isabelle ( Isabelle/ML. Архивировано 30 августа 2020 г. на Wayback Machine ) интегрирует параллельный Poly/ML в интерактивное средство доказательства теорем со сложной интегрированной средой разработки (на основе jEdit ) для официального стандарта ML (SML'97), Isabelle/ML. диалект и язык доказательства. Начиная с Isabelle2016, для ML также доступен отладчик уровня исходного кода.
  • Poplog реализует версию Standard ML вместе с Common Lisp и Prolog , что позволяет программировать на смешанных языках; все они реализованы в POP-11 , который компилируется постепенно .
  • TILT — это полностью сертифицированный компилятор для Standard ML, который использует типизированные промежуточные языки для оптимизации кода и обеспечения корректности и может компилироваться в типизированный ассемблер .

Все эти реализации имеют открытый исходный код и доступны бесплатно. Большинство из них реализованы в Standard ML. Коммерческих реализаций больше нет; Harlequin , ныне несуществующая, когда-то выпустила коммерческую IDE и компилятор под названием MLWorks, которые перешли к Xanalys и позже были открыты с открытым исходным кодом после того, как 26 апреля 2013 года они были приобретены Ravenbrook Limited.

Крупные проекты с использованием SML [ править ]

ИТ -университета Копенгагена Вся корпоративная архитектура реализована примерно в 100 000 строк SML, включая учет персонала, расчет заработной платы, администрирование курсов и обратную связь, управление студенческими проектами и веб-интерфейсы самообслуживания. [8]

Помощники доказательства HOL4 , Isabelle , LEGO и Twelf написаны на стандартном ML. Он также используется авторами компиляторов и разработчиками интегральных схем, такими как ARM . [9]

См. также [ править ]

Ссылки [ править ]

  1. ^ Перейти обратно: а б «Программирование в стандартном машинном обучении: иерархии и параметризация» . Проверено 22 февраля 2020 г.
  2. ^ Перейти обратно: а б с «СМЛ '97» . www.smlnj.org .
  3. ^ Перейти обратно: а б «itertools — Функции, создающие итераторы для эффективного циклирования — документация Python 3.7.1rc1» . docs.python.org .
  4. ^ «Влияния — Справочник по ржавчине» . Справочник по ржавчине . Проверено 31 декабря 2023 г.
  5. ^ Перейти обратно: а б Милнер, Робин ; Тофте, Мэдс; Харпер, Роберт; МакКуин, Дэвид (1997). Определение стандарта ОД (пересмотренного) . МТИ Пресс. ISBN  0-262-63181-4 .
  6. ^ Перейти обратно: а б Окасаки, Крис (2000). «Нумерация в ширину: уроки небольшого упражнения по разработке алгоритмов». Международная конференция по функциональному программированию 2000 г. АКМ.
  7. ^ «Стандартная базовая библиотека машинного обучения» . smlfamily.github.io . Проверено 10 января 2022 г.
  8. ^ Перейти обратно: а б Тофте, Мэдс (2009). «Стандартный язык ML» . Схоларпедия . 4 (2): 7515. Бибкод : 2009SchpJ...4.7515T . doi : 10.4249/scholarpedia.7515 .
  9. ^ Перейти обратно: а б Алглав, Джейд ; Фокс, Энтони Си Джей; Иштиак, Самин; Мирин, Магнус О.; Саркар, Сусмит; Сьюэлл, Питер; Нарделли, Франческо Заппа (2009). Семантика Power и многопроцессорного машинного кода ARM (PDF) . DAMP 2009. стр. 13–24. Архивировано (PDF) из оригинала 14 августа 2017 г.

Внешние ссылки [ править ]

О стандартном машинном обучении

О преемнике МЛ

  • преемник ML (sML) : эволюция ML с использованием стандартного ML в качестве отправной точки.
  • HaMLet на GitHub : эталонная реализация для преемника ML

Практичный

Академический

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 5286E09120DCDF42DD935BBF722EA684__1718233260
URL1:https://en.wikipedia.org/wiki/Standard_ML
Заголовок, (Title) документа по адресу, URL1:
Standard ML - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)