Идрис (язык программирования) - Idris (programming language)

Идрис
ПарадигмаФункциональный
РазработаноЭдвин Брэди
Впервые появился2007; 13 лет назад (2007)[1]
Стабильный выпуск
1.3.3[2] / 24 мая 2020 г.; 6 месяцев назад (2020-05-24)
Операционные системыКроссплатформенность
ЛицензияBSD
Расширения имени файла.idr, .lidr
Интернет сайтИдрис-Ланг.org
Под влиянием
Агда, Чистый,[3] Coq,[4] Эпиграмма, F #, Haskell,[4] ML,[4] Ржавчина[3]

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

Идрис система типов похоже на Агда 's, и доказательства аналогичны Coq, включая тактика (доказательство теорем функции / процедуры ) через отражение в разработчике.[5] По сравнению с Agda и Coq, Идрис отдает приоритет управлению побочные эффекты и поддержка встроенные предметно-ориентированные языки. Идрис компилируется в C (полагаясь на настраиваемое копирование уборщик мусора с помощью Алгоритм Чейни ) и JavaScript (как браузер, так и Node.js -основан). Существуют сторонние генераторы кода для других платформ, в том числе JVM, CIL, и LLVM.[6]

Идрис назван в честь поющего дракона из детской телевизионной программы Великобритании 1970-х годов. Ивор Двигатель.[7]

Функции

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

Функциональное программирование

Синтаксис Idris во многом похож на синтаксис Haskell. А привет мировая программа в Идрисе может выглядеть так:

модуль Главныйглавный : IO ()главный = putStrLn "Привет, мир!"

Единственные отличия этой программы от ее Эквивалент Haskell являются одинарным (вместо двойного) двоеточием в подпись типа функции main и опущение слова where в объявлении модуля.[8]

Индуктивные и параметрические типы данных

Идрис поддерживает индуктивно определенные типы данных и параметрический полиморфизм. Такие типы можно определить как в традиционном "Haskell98 "-подобный синтаксис:

данные Дерево а = Узел (Дерево а) (Дерево а) | Лист а

или в более общем смысле GADT -подобный синтаксис:

данные Дерево : Тип -> Тип куда    Узел : Дерево а -> Дерево а -> Дерево а Лист : а -> Дерево а

Зависимые типы

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

данные Vect : Нат -> Тип -> Тип куда  Ноль  : Vect 0 а (::) : (Икс : а) -> (хз : Vect н а) -> Vect (п + 1) а

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

общийдобавить : Vect н а -> Vect м а -> Vect (п + м) приложение Ноль       ys = ysappend (Икс :: хз) ys = Икс :: добавить xs ys

Функции добавляют вектор из m элементов типа a к вектору из n элементов типа a. Поскольку точные типы входных векторов зависят от значения, во время компиляции можно быть уверенным, что результирующий вектор будет иметь ровно (n + m) элементов типа a. Слово «total» вызывает проверка целостности который сообщит об ошибке, если функция не охватывает все возможные случаи или не может быть (автоматически) доказано, что не участвует в бесконечный цикл.

Другой распространенный пример - попарное сложение двух векторов, параметризованных по своей длине:

общийпараДобавить : Num а => Vect н а -> Vect н а -> Vect n apair Добавить Ноль       Ноль       = НольпараДобавить (Икс :: хз) (у :: ys) = Икс + у :: пара Добавить xs ys

Num a означает, что тип a принадлежит тип класс Num. Обратите внимание, что эта функция по-прежнему успешно проверяет тип как total, даже несмотря на то, что нет регистра, совпадающего с Nil в одном векторе и числом в другом. Поскольку система типов гарантирует, что оба вектора имеют одинаковую длину, мы можем быть уверены во время компиляции, что этого не произойдет. Следовательно, нет необходимости упоминать, чтобы функция была полной.

Функции Proof Assistant

Зависимые типы достаточно мощны, чтобы кодировать большинство свойств программ, и программа Idris может доказывать инварианты во время компиляции. Это превращает Идриса в помощника доказательства.

Есть два стандартных способа взаимодействия с помощниками доказательств: путем написания серии тактических призывов (Coq стиль), или путем интерактивной разработки доказательства (Эпиграмма /Агда стиль). Идрис поддерживает оба режима взаимодействия, хотя набор доступных тактик пока не так полезен, как у Coq.[нечеткий ]

Генерация кода

Поскольку в Идрисе есть помощник по доказательствам, программы Идриса могут быть написаны для передачи доказательств. Если к ним относиться наивно, такие доказательства остаются во время выполнения. Идрис стремится избежать этой ловушки, активно стирая неиспользуемые термины.[9][10]

По умолчанию Идрис генерирует собственный код через C. Другой официально поддерживаемый бэкэнд генерирует JavaScript.

Идрис 2

Идрис 2 - новый самостоятельный версия языка, которая глубоко интегрирует система линейного типа, на основе количественная теория типов. В настоящее время он компилируется в Схема и C. Последняя версия - 0.2.1, выпущенная 16 августа 2020 года.[11]

Смотрите также

Рекомендации

  1. ^ Брэди, Эдвин (12 декабря 2007 г.). "Указатель / ~ eb / darcs / Idris". Сент-Эндрюсский университет Школа компьютерных наук. Архивировано из оригинал на 2008-03-20.
  2. ^ «Выпуск 1.3.3». Получено 2020-05-25.
  3. ^ а б «Типы уникальности». Idris 1.3.1 Документация. Получено 2019-09-26.
  4. ^ а б c «Идрис, язык с зависимыми типами». Получено 2014-10-26.
  5. ^ «Отражение разработчика - документация Idris 1.3.2». Получено 27 апреля 2020.
  6. ^ «Цели генерации кода - документация Idris 1.1.1». docs.idris-lang.org.
  7. ^ "Часто задаваемые вопросы". Получено 2015-07-19.
  8. ^ «Руководство по синтаксису - документация Idris 1.3.2». Получено 27 апреля 2020.
  9. ^ «Удаление по анализу использования - документация Idris 1.1.1». idris.readthedocs.org.
  10. ^ «Результаты сравнения». ziman.functor.sk.
  11. ^ «Идрис 2, версия 0.2.1 выпущена». Получено 2020-08-17.

внешняя ссылка