Jump to content

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

Идрис
Парадигма Функциональный
Разработано Эдвин Брэди
Впервые появился 2007 г .; 17 лет назад ( 2007 ) [1]
Стабильная версия
1.3.4 [2] / 22 октября 2021 г .; 2 года назад ( 22.10.2021 )
Предварительный выпуск
0.7.0 (Идрис 2) [3] / 22 декабря 2023 г .; 5 месяцев назад ( 22.12.2023 )
Дисциплина набора текста Предполагаемый , статичный , сильный
ТЫ Кросс-платформенный
Лицензия БСД
Расширения имен файлов .idr, .lidr
Веб-сайт просто идрис .org
Под влиянием
Пригласить , Очистить , [4] Кок , [5] Эпиграмма , F# , Haskell , [5] МЛ , [5] Ржавчина [4]

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

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

Идрис назван в честь поющего дракона из британской детской телепрограммы 1970-х годов «Паровозик Айвор» . [8]

Особенности [ править ]

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

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

Синтаксис Idris имеет много общего с синтаксисом Haskell. Программа hello world в Идрисе может выглядеть так:

module Main

main : IO ()
main = putStrLn "Hello, World!"

Единственные различия между этой программой и ее эквивалентом на Haskell - это одиночное (вместо двойного) двоеточие в сигнатуре типа основной функции и отсутствие слова " where" в объявлении модуля . [9]

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

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

data Tree a = Node (Tree a) (Tree a) | Leaf a

или в более общем синтаксисе, подобном обобщенному алгебраическому типу данных (GADT):

data Tree : Type -> Type where
    Node : Tree a -> Tree a -> Tree a
    Leaf : a -> Tree a

Зависимые типы [ править ]

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

data Vect : Nat -> Type -> Type where
  Nil  : Vect 0 a
  (::) : (x : a) -> (xs : Vect n a) -> Vect (n + 1) a

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

total
append : Vect n a -> Vect m a -> Vect (n + m) a
append Nil       ys = ys
append (x :: xs) ys = x :: append xs ys

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

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

total
pairAdd : Num a => Vect n a -> Vect n a -> Vect n a
pairAdd Nil       Nil       = Nil
pairAdd (x :: xs) (y :: ys) = x + y :: pairAdd xs ys

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

Функции помощника по проверке доказательств [ править ]

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

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

Генерация кода [ править ]

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

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

Идрис 2 [ править ]

Idris 2 — это новая самостоятельная версия языка, в которой глубоко интегрирована система линейных типов , основанная на количественной теории типов . время он компилируется в Scheme и C. В настоящее [12]

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

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

  1. ^ Брэди, Эдвин (12 декабря 2007 г.). «Индекс /~eb/darcs/Idris» . Сент-Эндрюсского университета Школа компьютерных наук . Архивировано из оригинала 20 марта 2008 г.
  2. ^ «Выпуск 1.3.4» . Гитхаб . Проверено 31 декабря 2022 г.
  3. ^ «Выпущена версия Idris 2 0.7.0» . Гитхаб . Проверено 20 апреля 2024 г.
  4. ^ Jump up to: Перейти обратно: а б «Типы уникальности» . Идрис 1.3.1 Документация . Проверено 26 сентября 2019 г.
  5. ^ Jump up to: Перейти обратно: а б с «Идрис, язык с зависимыми типами» . Проверено 26 октября 2014 г.
  6. ^ «Размышление разработчика — документация Idris 1.3.2» . Проверено 27 апреля 2020 г.
  7. ^ «Цели генерации кода — последняя документация Идриса» . docs.idris-lang.org .
  8. ^ «Часто задаваемые вопросы» . Проверено 19 июля 2015 г.
  9. ^ «Руководство по синтаксису — документация Idris 1.3.2» . Проверено 27 апреля 2020 г.
  10. ^ «Анализ стирания по использованию — последняя документация Idris» . idris.readthedocs.org .
  11. ^ «Результаты сравнительного анализа» . ziman.functor.sk .
  12. ^ "идрис-ланг/Идрис2" . Гитхаб . Проверено 11 апреля 2021 г.

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 74afefcfd8d1913dbdbbf0e9e6caa0fe__1717439040
URL1:https://arc.ask3.ru/arc/aa/74/fe/74afefcfd8d1913dbdbbf0e9e6caa0fe.html
Заголовок, (Title) документа по адресу, URL1:
Idris (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)