Light-electric.com

IT Журнал
21 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ml язык программирования

Как создать ML-модель, которую клиент захочет внедрить (а не работать в стол)

Об этом рассказал Алексей Рустамов из Loginom Company на встрече Data&Science в Яндексе. Его компания уже лет 20 занимается анализом данных, в частности, кредитным скорингом, на примере которого и строится рассказ. Оказалось, что основная причина низкого проникновения ML — недоверие заказчика к моделям. Но этого можно избежать.

Большая часть популярных задач машинного обучения связана с проблемами поиска, рекомендаций, обогащения данных, анализа изображений, перевода, и игр. С другой стороны, в России более 80% бизнеса — это «традиционная экономика»: сырьё, транспорт, строительство, торговля, финансы, банкинг. Задачи у них иные — оптимизация запасов, управление рисками, производство, логистика, клиентская лояльность. И ситуация с анализом данных там достаточно плохая. Почему же имеющиеся потребности не покрываются уже доступными алгоритмами?

Для современных датасайнтистов важно построить модель посложнее и пооригинальнее, желательно с нейросетями, но бизнесу нужно иное — модель поинтерпретируемее. Определение data mining от Пятецкого-Шапиро — обнаружение в сырых данных ранее неизвестных , полезных, нетривиальных и интерпретируемых фактов, приносящих практическую пользу. Бизнес не готов применять чёрные ящики, потому что цена ошибки там очень большая, и доверять доверять системам там не очень могут.

Основа доверия- предсказуемость: осознание ограничений, понимание всех проделанных при построении модели шагов, аргументация каждого из них, тестируемость, и нормальное поведение модели в граничных и нестандартных случаях. Если не сделать систему предсказуемой, её не внедрить. Поэтому надо стараться делать из чёрных ящиков белые, или хотя бы серые. Разберём на примере кредитного скоринга, как это вообще возможно.

Сперва банки использовали для кредитования жёсткие правила, придуманные экспертами, и доверие им было высокое. Потом начали использовать generic модели — они обычно выдаются кредитным бюро, и доверие к ним определяется доверием к авторитету бюро. Следующий шаг — индивидуальные модели каждого банка и, возможно, кредитного продукта. Доверие тут появляется из-за того, что клиент очень тесно взаимодействует с исполнителем в процессе построения, и видит, как модель создаётся на его глазах. И последний этап развития — промышленное построение моделей — пользуется доверием уже не к отдельным формулам, а к процессу их подбора.

Вместе с формулой и кодом заказчику можно передавать паспорт скоринговой модели — доказательство её адекватности. Он документирует всю историю создания, а потом и использования модели. Это такой талмуд на десятки, а иногда и сотни страниц.

Как готовятся данные

  • Описываем статистические показатели: пропуски, выбросы, аномалия, дубли. Описываем их с точки зрения бизнес-логики: недостоверные и несогласующиеся друг с другом данные.
  • Исключаем некоторые атрибуты, если на то есть причины: плохая статистика, данные из будущего (например, поведенческие данные для аппликационного скоринга), несоответствие бизнес-требованиям. Для каждого атрибута надо предоставить объяснения.
  • Обработка редких значений: можно исключить записи, можно работать как с пропусками, можно заменять по заранее оговоренному правилу. Для каждого случая главное объяснить, почему мы так делаем.
  • Порождение атрибутов (feature engineering) — производные и агрегации имеющихся атрибутов, и кросс-характеристики. Все формулы и правила формирования каждого атрибута надо описать.
  • Отдельно надо описать обязательные атрибуты (по требованиям документооборота, законодательства, бизнес-процессов, или «значимые» с точки зрения рисковиков банка — чтобы последние были уверены, что мы их учли).
  • Очень важно определить и аргументировать целевую переменную (что такое вообще дефолт?). Есть случаи, когда заказчик считал оттоком одно, а клиент — другое, и уже построенная модель выкидывалась. Чтобы такого не происходило, целевую переменную надо фиксировать с самого начала.
  • Получив данные, надо описать формирование обучающего и тестового множеств, и описать расписание фич и целевой переменной в разрезе этого разбиения.

Вот сколько всего нужно сделать и задокументировать, и это мы ещё даже не приступали к моделированию. Кажется, это очень отличается от того, как проходят соревнования на Kaggle.

Для моделирования можно отбирать атрибуты, опираясь, например, на корреляции, WoE, и IV. Последние две аббревиатуры — способы измерить, насколько классификатор с единственным категориальным признаком даёт лучше, чем модель без признаков вообще, с точки зрения правдоподобия.

Моделировать стоит с традиционного алгоритма — логистической регрессии, ибо она знакома рисковикам, легко интерпретируется, и её можно использовать как бейзлайн. Потом можно построить что-нибудь более сложное, скажем, градиентный бустинг над деревьями, но надо будет ещё доказывать, что он лучше логистической модели.

Уже построив модель, важно чётко описать логику выбора порога отсечения — это определяется исходя из бизнес-задачи. Впрочем, лично в моём опыте достаточно было строить скоринговую модель, которая хорошо ранжирует заёмщиков, а уж какую бизнес-логику на неё вешать, заказчику виднее.

Обучив классификатор, надо измерить его качество: джини, рок-аук, колмогоров-смирнов, и всё прочее. Чем больше разных метрик, тем лучше.

Построив модель, нужно сделать для неё и мониторинг — описать его регулярность, правила расчёта индикаторов, и логику оповещения в случае разных необычных обстоятельств. Если за этим не следить, модель может тихо умереть и никому не сказать. Были случаи, когда модель, потерявшая предсказательную силу, несколько лет продолжала функционировать, и в этом заказчик обвинил её создателя. Мониторинг нужен, чтобы такого не происходило, и доверие к модели сохранялось.

Финальная проверка — модель должна соответствовать экономическому смыслу, и не вызывать отторжения экспертов.

Итак, что повышает доверие :

  • указание области применимости и ограничений модели
  • объяснение всех преобразований данных (часто всякие кэглеры этим не занимаются, ибо привыкли работать с готовыми данными)
  • правила обработки граничных случаев (чем больше подушек безопасности, тем лучше)
  • объяснение логики отбора факторов
  • объяснение самой подогнанной формулы, даже если это что-то сложнее линейной модели
  • тестирование модели на отдельных кейсах
  • расчёт индикаторов качества
  • проверка на соответствие бизнес-логике

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

Классический пример глупого провала — чатбот от Майкрософта, который меньше чем за сутки стал нацистом. Чтобы доверие к модели было, надо сначала придумать тесты и аргументы, которыми мы будем оперировать, и потом уже думать, как построить модель, которая бы этим требованиям удовлетворяла.

Один из вариантов убеждения заказчика — проверка на исторических данных. Другой вариант — A/B тесты (в банках говорят champion-challenger), это относительно дешёвый способ убедить людей в качестве применения модели, чтобы потом переключиться на новую модель полностью.

Q : Cколько признаков входит в типичную скоринговую модель, и какая у неё обычно предсказательная сила?

A : Типично в финальной модели используется не так много переменных: в обучении их могут быть сотни и тысячи (включая множество производных), но после довольно жёсткого отбора остаются 20-30 показателей. Приемлемые значения AUC для разных задач скоринга (аппликационный, коллекторский, поведенческий) — свои; они есть у нас на сайте.

Q : Есть ли в России законодательные ограничения на использование переменных, как в Америке?

A : Может быть и есть, но докладчик никогда с этим не сталкивался.

Q : Обязательно ли использовать логистическую регрессию?

A : Не обязательно, но её точно не следует выкидывать из рассмотрения.

Q : Как презентуются результаты модели заказчику?

A : Тот самый паспорт.

Q : И за счёт чего внешним компаниям удаётся побить имеющиеся у клиента модели?

A : Или за счёт низкой базы (у маленьких банков), или за счёт внешних данных и более качественной предобработки.

Другие доклады с того же мероприятия раскрыли несколько смежных тем:

  • Как выглядит жизненный цикл коммерческого проекта с точки зрения исполнителя?
  • Как выбрать схему ценообразования ML-проекта ? Стоит ли привязывать его стоимость к затратам или результату, или оставить фиксированной?
  • Должен ли data scientist писать код для продакшна ?
Читать еще:  Параллельное программирование это

Ml язык программирования

ML (Meta Language) — семейство строгих языков функционального программирования с развитой полиморфной системой типов и параметризуемыми модулями. ML преподаётся во многих западных университетах (в некоторых даже как первый язык программирования).

Сильно типизированный язык со статическим контролем типов и аппликативным выполнением программ. Отличие его от других языков заключается в том, что программист не должен объявлять типы данных — для этого существует специальный механизм вывода типа данных результирующих выражений. Этот механизм вывода типов делает возможным перегрузку и сопоставление с образцом на основе унификации, почти как в языке Prolog, однако без необходимости (постоянного) контроля типов выражений. Более привычные компоненты ML — сборка мусора, встроенные средства поддержки исключений, модульность.

Основные достоинства ML — высокая верифицируемость программ, простота отладки, потенциал для крайне высокой оптимизации, уникальная краткость записи.

Основные недостатки — сложность синтаксиса, непривычность принятых соглашений и ограничений, практическая невозможность макротрансформаций.

Как и в языке LISP, программа на ML состоит из определений нескольких функций. Каждая функция имеет статически определенные типы аргументов и возвращаемого значения. Поскольку ML является аппликативным языком, то хранение переменных в нем осуществляется иначе, чем в языках С или FORTRAN. Изменение значений переменных запрещено («однократные присвоения»). Внутреннее содержимое структурных объектов, списков и строк не может быть изменено в принципе, либо требует предварительного объявления мутируемых полей (в [o]caml). Это упрощает оптимизацию, отладку и сборку мусора, основанную на поколениях (generational garbage collection). Для имитации присвоений программист может применять объект ref — контейнер с одним модифицируемым полем. Функциональное выполнение программы на ML подразумевает, что параметры функций передаются по значению, составляющие сложных объектов (размещенные в куче) при этом не копируются, являясь разделяемыми.

Комментарии в ML обозначаются следующим образом: (* … *). ML позволяет создавать записи и абстрактные типы данных, а также создавать и обрабатывать исключения. Возможности ввода-вывода в ML не очень велики, что обусловлено областью его применения — большинству исследователей не требуется обрабатывать многочисленные базы данных с использованием сложных форматов. Синтаксис этого языка необычайно запутан, превосходя сложностью даже синтаксис C++.

Имеет диалекты: Standard ML, CaML Light и Objective CaML (последний является в том числе объектно-ориентированным языком программирования).

Язык ML (MetaLanguage) является аппликативным языком, программы на этом языке пишутся примерно так же, как на языке С или Pascal. Однако это аппликативный язык с улучшенной концепцией типов данных. ML поддерживает полиморфизм и, с помощью своей системы типов, абстракции данных. Основные структуры этого языка относительно компактны, особенно в сравнении с таким языком, как Ada. Но его возможность расширять типы данных обеспечивает ему большую мощь в случае написания сложных программ. ML включает создание и обработку исключительных ситуации (исключений), императивное и функциональное программирование, основанные на правилах спецификации, и большую часть концепций, представленных в других языках программирования. Если бы потребовалось выбрать один-единственный язык для изучения многих концепций языков программирования, то ML оказался бы наиболее подходящим кандидатом, пока не встал бы вопрос о коммерческой живучести. Роберт Милнер ML завоевал большую популярность в исследовательских кругах и в области компьютерного образования. Доступность механизма определения типов данных на уровне исходной программы — то свойство ML, которое выгодно отличает его от других распространенных языков программирования. Однако коммерческих приложений, написанных на языке ML, практически нет; до сих пор он остается всего лишь инструментом при проведении теоретических исследований в области информатики и широко используется в образовании.

ML был разработан группой программистов во главе с Робертом Милнером. Этот язык был задуман как механизм для построения (при помощи компьютера) формальных доказательств в системе логики для вычислимых функций, разработанной в середине 70-х гг. в Эдинбурге (Edinburgh Logic for Computable Functions). Но оказалось, что ML также полезен и в области символьных вычислений. В 1983 г. язык был пересмотрен, дополнен такими концепциями, как модули, и стал называться «стандартный ML» (Standard ML). Хотя обычно он реализуется как интерпретируемый язык, сравнительно легко можно создать и использовать его компилируемую версию. Первые компиляторы ML появились в 1984 г.

К концу 80-х гг. Standard ML уже распространился в среде исследователей языков программирования. Одна из популярных версий ML была разработана Дэвидом Аппелем (David Appel) из Принстонского университета и Дэвидом Маккуином (David McQueen) из AT&T Bell Telephone Laboratories. Именно эта версия использовалась для проверки примеров программ на ML, которые приведены в нашей книге.

Ml язык программирования

Блиц-обзор языков программирования

Скажите, сколько языков программирования вы знаете? Нет, не каким количеством языков владеете, а сколько названий можете перечислить? Попробовав без подготовки ответить на этот вопрос, ваш покорный слуга за малым не дотянул до двух десятков. Попробуйте сами: это интересно.

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

ABC — интерактивный язык и среда разработки, который по замыслу создателей должен был заменить BASIC. Язык создавался по результатам анализа хода разработки программ. Первоначально предназначенный для начинающих, ABC развился в мощный язык, подходящий как новичкам, так и профессионалам.

ADA — язык, разработанный с целью обеспечить создание программных систем с многолетним сроком службы и высокой степенью надежности. Создан по заказу и состоит на вооружении министерства обороны США. Сравнительно с другими языками, ADA обнаруживает большое количество ошибок еще во время компиляции программ. Для предотвращения возможных ошибок в ходе выполнения используется механизм обработки исключений.

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

ALGOL — язык, ставший важной вехой в развитии языков программирования. Логичный и математически строгий, до сих пор применяется для записи алгоритмов.

ALLOY — язык программирования «повышенного» уровня, ориентированный на программирование параллельных компьютерных систем. Alloy комбинирует подходы функционального, объектного и логического программирования.

AMPL — полный и мощный язык алгебраического моделирования. Позволяет решать задачи линейной и нелинейной оптимизации с дискретными или непрерывными переменными.

APL — язык математической обработки данных. Отличительной особенностью является использование нестандартных символов и компактной мощной нотации.

AWK — язык назван по первым буквам фамилий авторов: Aho, Weinberger, Kernighan. Они писали: «AWK является удобным и выразительным языком, подходящим для решения широкого круга задач как вычислительного характера, так и связанных с обработкой данных».

BASIC — язык и среда, разработаны в 1964 г. в Дартмутском колледже. BASIC создавался как очень простой в изучении язык, который было бы легко компилировать. Авторы отводили ему роль первого шага на пути к изучению других языков.

C — третья буква английского алфавита, название языка программирования, разработанного Деннисом Ричи в начале 70-х годов в Bell Laboratories. Использован для реализации OS Unix. Часто характеризуется как «переносимый ассемблер».

C++ -расширение языка С. В частности, С++ поддерживает объектно-ориентированное программирование. Разработан в Bell Laboratories Бьерном Страустрапом.

COBOL — один из первых языков программирования. Ориентирован на разработку программ для обработки коммерческих данных и управления бизнесом. Широко используется до сих пор.

DYLAN — язык общего назначения, пригодный как для прикладного, так и для системного программирования. Включает в себя сборку мусора, проверки в ходе исполнения, восстановление после ошибок и модульную систему.

EIFFEL — «чистый» объектно-ориентированный язык с акцентом на разработке надежного программного обеспечения.

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

Читать еще:  Основы программирования vba

FORTRAN — первый язык программирования высокого уровня. Главное применение — числовые расчеты. Употребляется до сих пор.

HASKELL — «чистый» функциональный язык. Программы на HASKELL состоят исключительно из функций. Язык основан на лямбда-исчислении и назван в честь логика Хаскела Кэрри, чьи работы были положены в основу языка.

ICON — высокоуровневый язык общего назначения. Обладает обширными средствами для обработки структур данных и манипуляций со строками. ICON является императивным процедурным языком с синтаксисом, напоминающим С или PASCAL, но с семантикой гораздо более высокого уровня.

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

JAVA — С-подобный объектно-ориентированный язык для программирования Internet-приложений.

LISP — язык обработки списков. Родной язык искусственного интеллекта. Разработан в конце 50-х Джоном Мак-Карти. В основу языка положена идея списков переменной длины и деревьев в роли основных типов данных, а также возможность интерпретации кода программы как данных и наоборот.

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

ML (meta-language) — семейство языков, как правило, функциональных, характеризуемых четкой семантикой, полиморфной системой типов и параметризованными модулями. Включает Standard ML, Lazy ML, CAML, CAML Light и многие экспериментальные языки. Особенную популярность ML-языки завоевали в сфере науки. В некоторых университетах их даже преподают в качестве первого языка программирования.

MODULA-2 — последовавший за PASCAL язык программирования Никлауса Вирта. Предназначен для реализации крупных программных проектов в профессиональном стиле, а также разработки встроенных систем реального времени.

MODULA-3 — язык, расширяющий MODULA-2. Разработан в конце 80-х компаниями DEC и Olivetti. Поддерживает сборку мусора, объектно-ориентированное программирование и спецификации компонентного программного обеспечения.

NETREXX — новый язык общего назначения. Призван служить альтернативой языку JAVA. К числу основных достоинств относятся простота синтаксиса Rexx в сочетании с надежностью и переносимостью JAVA. В результате язык подходит как для написания скриптов, так и для разработки приложений.

OBERON, OBERON-2 — языки, продолжающие традицию PASCAL и MODULA. OBERON-2 включает в себя автоматическую сборку мусора и объектно-ориентированное программирование. Кроме того, так называется новаторская современная операционная система, полностью разработанная на языке OBERON-2.

OBLIQ — нетипизированный интерпретирующий язык, реализующий концепцию распределенного объектно-ориентированного программирования. OBLIQ-программа может включать множественные потоки исполнения в одном или нескольких адресных пространствах на одной или на многих машинах в составе одной или нескольких сетей, взаимодействующих через Internet.

OCCAM — язык параллельных вычислений, разработанный для программирования транспьютеров. Позволяет программисту реализовывать схемы последовательной и/или параллельной обработки данных.

PASCAL — язык, разработанный Виртом для целей обучения. PASCAL включает в себя элементы, общие для большинства языков программирования. Жесткие правила языка делают написание программ с ошибками довольно трудным делом.

PERL — язык, оптимизированный для просмотра текстовых файлов, извлечения из них информации и генерации соответствующих отчетов. Широко применяется для системного администрирования среды Unix. Сочетает в себе качества С, AWK и является скорее практичным, чем элегантным языком.

PHANTOM — современный интерпретирующий язык, созданный для решения проблем, связанных с программированием крупных распределенных интерактивных приложений, таких, как сетевые игры, системы связи и средства групповой работы. PHANTOM частично унаследовал семантику OBLIQ.

PL/1 — язык общего назначения, который по замыслу IBM должен был вытеснить специализированные языки программирования. PL/1 предназначался не только для программирования в сферах коммерции, науки и инженерного дела, но даже для системного программирования. Попытка не удалась.

POSTSCRIPT — язык, оптимизированный для вывода текста и графики. Изображение может выводиться на произвольное устройство, будь то принтер или дисплей. Сейчас POSTSCRIPT часто называют «языком описания страниц». Разработан фирмой Adobe в 1985 году.

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

PYTHON — интерпретирующий объектно-ориентированный язык программирования. По своему назначению принадлежит к группе языков Tcl, Perl, Scheme и Java. Поддерживает модули, классы, исключения и динамические типы данных.

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

REXX — процедурный язык с ясным синтаксисом, поддерживающий структурное программирование. Предназначен для манипуляций с символическими объектами.

SATHER — объектно-ориентированный язык, который претендует быть таким же эффективным, как C или Fortran, таким же элегантным, но более надежным, чем Eiffel, таким же абстрактным, как Lisp или Scheme.

SCHEME — диалект LISP, имеющий предельно ясную и простую семантику. С его помощью удобно программировать и в императивном, и в функциональном стиле, и в стиле передачи сообщений.

SIMULA — объектно-ориентированный язык, разработанный в 1967 году. Широко применяется практически для всех видов обработки данных. Стандартизирован в 1986 году. Язык SIMULA реализован почти на всех моделях компьютеров: от больших машин до персональных.

SMALLTALK — объектно-ориентированный язык, происходящий от SIMULA. Очень эффективен в прототипировании сложных графических интерфейсов.

SR (Synchronizing Resources) — язык для разработки параллельных программ. Главными конструкциями языка являются ресурсы и операции. Ресурсы инкапсулируют процессы и разделяемые переменные, а операции служат основой взаимодействия процессов.

Tcl — строко-ориентированный скриптующий язык и интерпретатор для встраивания в приложения.

ru.knowledgr.com

ML — функциональный язык программирования общего назначения, развитый Робином Милнером и другими в начале 1970-х в Эдинбургском университете, синтаксис которого вдохновлен ISWIM. Исторически, ML обозначает мета-язык: это было задумано, чтобы развить тактику доказательства в программе автоматического доказательства теоремы LCF (у чьего языка, pplambda, комбинации исчисления предиката первого порядка и просто напечатанного полиморфного исчисления лямбды, был ML как его мета-язык). Это известно его использованием алгоритма вывода типа Хиндли-Milner, который может автоматически вывести типы большинства выражений, не требуя явных аннотаций типа. Кроме того, использование этого алгоритма обеспечивает безопасность типа — есть формальное доказательство, что хорошо напечатанная программа ML не вызывает ошибки типа во время выполнения.

Обзор

ML часто упоминается как нечистый функциональный язык, потому что он позволяет побочные эффекты, в отличие от чисто функциональных языков программирования, таких как Хаскелл.

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

В отличие от Хаскелла, ML использует нетерпеливую оценку, что означает, что все подвыражения всегда оцениваются. Однако ленивая оценка может быть достигнута с помощью закрытий. Таким образом можно создать и использовать бесконечные потоки в качестве в Хаскелле, но их выражение косвенное.

Сегодня в семье ML есть несколько языков; два главных диалекта — Стандартный ML (SML) и Caml, но другие существуют, включая F# — язык, который Microsoft поддерживает для их.NET платформы. Идеи от ML влияли на многочисленные другие языки, как Хаскелл, Циклон и Nemerle.

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

Примеры

Следующие примеры используют синтаксис Стандартного ML. Другой наиболее широко используемый диалект ML, OCaml, отличается различными иллюзорными способами.

Читать еще:  Программирование в командной строке windows

Факториал

Функция факториала, выраженная как чистый ML:

забава fac (0: интервал): интервал = 1

| fac (n: интервал): интервал = n * fac (n — 1)

Это описывает факториал как рекурсивную функцию с единственным случаем основы завершения. Это подобно описаниям факториалов, найденных в учебниках по математике. Большая часть кодекса ML подобна математике в средстве и синтаксисе.

Часть показанного определения дополнительная, и описывает типы этой функции. Примечание E: t может быть прочитан, поскольку у выражения E есть тип t. Например, аргументу n назначают целое число типа (интервал) и fac (n: интервал), результат применения fac к целому числу n, также имеет целое число типа. У функции fac в целом тогда есть функция типа от целого числа до целого числа (интервал-> интервал). Благодаря выводу типа аннотации типа могут быть опущены и будут получены компилятором. Переписанный без аннотаций типа, пример похож:

забава fac 0 = 1

| fac n = n * fac (n — 1)

Функция также полагается на соответствие образца, важную часть программирования ML. Обратите внимание на то, что параметры функции находятся не обязательно в круглых скобках, но отделены местами. Когда аргумент функции будет 0 (ноль), это возвратит целое число 1 (один). Для всех других случаев пробуют вторую линию. Это — рекурсия и выполняет функцию снова, пока основной случай не достигнут.

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

забавный факт n = позволил

забава fac 0 = 1

| fac n = n * fac (n — 1)

Проблематичный случай (когда n отрицателен) демонстрирует использование системы исключения ML.

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

забавный факториал n = позволил

забава fac (0, acc) = acc

| fac (n, acc) = fac (n — 1, n * acc)

Перемена списка

Следующая функция «полностью изменяет» элементы в списке. Более точно это возвращает новый список, элементы которого в обратном порядке по сравнению с данным списком.

| перемена (x:: xs) = (полностью изменяют xs), [x]

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

забавная перемена xs = позволила

забавный оборот [] acc = acc

| оборот (HD:: tl), acc = газуют на tl (HD:: acc)

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

См. также

Диалекты

  • CakeML версия петли «читают печать оценки» ML с формально проверенным временем выполнения и переводом на ассемблер
  • Caml, диалект ML развился в INRIA
  • Зависимый ML, расширение ML с иждивенцем, печатающим, который привел к развитию ATS
  • Ленивый ML, экспериментальное лениво оценило диалект ML с начала 1980-х, которые проложили путь к компиляции языков вызова по необходимости, таких как Хаскелл и Чистый

:* OCaml, популярное внедрение Caml с поддержкой объектно-ориентированного программирования

  • Rpal, образовательный язык имел отношение к ML
  • Стандартный ML, формально указанный диалект ML и его внедрения:

:* Элис МЛ, расширение Стандартного ML с поддержкой параллельного программирования, используя фьючерсы

:* Гамлет, переводчик, стремящийся служить точным справочным внедрением и полезным образовательным инструментом

:* ML5, вариант исследования Стэндарда МЛ, разработанного для распределенного вычисления

:* MLKit, компилятор для Стандартного ML показ находящегося в области управления памятью рядом с дополнительной сборкой мусора

:* MLton, сильный оптимизирующий компилятор целой программы, строго соответствующий Определению

:* Московский ML, внедрение, первоначально основанное на Свету Caml

[V] Хорош ли синтаксис языка программирования V?

Создаю язык программирования для CGI и текстовых терминалов. Сайт www.vlang.ru. Ищу конструктивную критику синтаксиса языка.

Выбор языка программирования
Добрый день, посетители форума. Мой путь в программирование начался 2 года назад, но учить начал.

Ребят, презентация нового языка программирования ObjectScript
Сколько же существует всяких языков программирования, еще один? Ну можно и так сказать, а можно.

Что мне может дать знание языка Perl и чем он хорош?
Думаю начать изучать язык Perl. Чем то он мне понравился. Но думаю — стоит или нет? Поэтому решил.

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

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

А вашу задачу лучше перевести в плоскость переводчика с русского языка на какой либо другой высокоуровневый язык программирования. Если вы не предлагаете новых концепций программирования.
Я сам люблю русский язык, но из синтаксиса языка программирования я бы выкидывал и русский и англ язык.

Таки есть и для вас вариант со значками вместо русских слов.

А вот тройной диспетчеризации вызова интерфейсной функции мало где еще есть.

Это получается, я могу сделать обычный бинарный файл? Или язык интерпретируемый?
На каком ЯП вы пишете ЯП?

Я советую вести разработку на github-e или подобном сайте, шансы на то, что вашу идею подхватят увеличатся. А заработать на вашей идее и исходниках, без вашего согласия, вряд ли кто то сможет.

Если язык уже реально хоть как то работает, то респект
Думаю многие на форуме пытались написать свой ЯП, но я не видел, чтоб кому то удалось показать прототип.

а они существуют? по моему есть множество описаний к ЯП, некоторые работы учёных вроде Тюринга, Чёрча Алонзо и всё :]

Я советую разобраться с haskell[чем я сейчас и занимаюсь], и с Лямбда-исчислениями, чтобы понимать функциональные языки программирования.
Для этого можно почитать Шевченко «O Haskell по человечески», книги Душкина Р. В., которые неявно критикует Шевченко :] поиграть в Godingame[не люблю рекламировать, но приходится]
Но я не скажу, что функциональный Haskell мне более приятен, чем D[да да, если останется время — почитайте Александреску]
Если видите явные ошибки в языке — переделывайте сразу, обратную совместимость лучше не поддерживать.

А ещё, лично мне, интересна поддержка квантового программирования[у Душкина есть книга], логической парадигмы, для ИИ и док-ва теорем. В математике ещё можно много интересного откопать для языков программирования[или где то ещё?]

Добавлено через 8 минут

Он работает, но без практик не выявить всех глюков. Скачать архив со средой можно с сайта. Там много примеров. И таки поддерживается AVX.

Добавлено через 53 минуты
В создании нового языка есть неявные сложности.
Я вот основоположил такие параметры:
1) однопроходность
2) адресонезависимость (все вызовы функций относительные)
3) русская раскладка клавиатуры

затем появилось множество других желаний, но все они учитывали основоположное.

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

если взять за основу другие параметры:
1) мощный анализ использования переменных
2) многовариантную систему хранения значений переменных
3) тотальную оптимизацию под многопоточность

то возможно еще бы не получил конечного варианта языка.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector