Идрис (язык программирования) - Idris (programming language)
Парадигма | Функциональный |
---|---|
Разработано | Эдвин Брэди |
Впервые появился | 2007 |
Стабильный выпуск | 1.3.3 / 24 мая 2020 г .
|
Предварительный выпуск | 0.5.1 (Idris 2) / 20 сентября 2021 г .
|
Операционные системы | Кроссплатформенность |
Лицензия | BSD |
Расширения имени файла | .idr, .lidr |
Веб-сайт | idris-lang |
Под влиянием | |
Agda , Clean , Coq , Epigram , F # , Haskell , ML , Rust |
Идрис - это чисто функциональный язык программирования с зависимыми типами , необязательным ленивым вычислением и такими функциями, как проверка целостности . Идрис можно использовать в качестве помощника по проверке , но он разработан как язык программирования общего назначения, похожий на Haskell .
Система типов Idris подобна системе типов Agda , а доказательства аналогичны системе типов Coq , включая тактику ( функции / процедуры доказательства теорем ) через рефлексию разработчика. По сравнению с Agda и Coq, Idris отдает приоритет управлению побочными эффектами и поддержке встроенных предметно-ориентированных языков . Idris компилируется в C (полагаясь на настраиваемый копирующий сборщик мусора с использованием алгоритма Чейни ) и JavaScript (как на основе браузера, так и на основе Node.js ). Существуют сторонние генераторы кода для других платформ, включая JVM , CIL и LLVM .
Идрис назван в честь поющего дракона из британской детской телепрограммы 1970-х « Айвор Паровозик» .
Функции
Idris сочетает в себе ряд функций относительно основных языков функционального программирования с функциями, заимствованными у помощников по доказательству .
Функциональное программирование
Синтаксис Idris имеет много общего с синтаксисом Haskell. Программа hello world в Идрисе может выглядеть так:
module Main
main : IO ()
main = putStrLn "Hello, World!"
Единственные различия между этой программой и ее эквивалентом в Haskell - это одинарное (вместо двойного) двоеточие в сигнатуре типа основной функции и отсутствие слова « where
» в объявлении модуля .
Индуктивные и параметрические типы данных
Идрис поддерживает индуктивно определенные типы данных и параметрический полиморфизм . Такие типы могут быть определены как в традиционном " Haskell98 " синтаксисе:
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
в одном векторе нет совпадения регистра, а в другом - числа. Поскольку система типов может доказать, что векторы имеют одинаковую длину, мы можем быть уверены, что во время компиляции такой случай не произойдет, и нет необходимости включать этот случай в определение функции.
Функции Proof Assistant
Зависимые типы достаточно мощны, чтобы кодировать большинство свойств программ, и программа Idris может доказывать инварианты во время компиляции. Это превращает Идриса в помощника по доказательствам.
Есть два стандартных способа взаимодействия с помощниками доказательства: путем написания серии тактических вызовов (стиль Coq) или путем интерактивной разработки термина доказательства ( стиль Epigram / Agda). Идрис поддерживает оба режима взаимодействия, хотя набор доступных тактик пока не так полезен, как у Coq.
Генерация кода
Поскольку в Идрисе есть помощник по доказательствам, программы Идриса могут быть написаны так, чтобы передавать доказательства. Если к ним относиться наивно, такие доказательства остаются во время выполнения. Идрис стремится избежать этой ловушки, агрессивно стирая неиспользуемые термины.
По умолчанию, Идрис генерирует машинный код через C . Другой официально поддерживаемый бэкэнд генерирует JavaScript .
Идрис 2
Idris 2 - это новая автономная версия языка, которая глубоко интегрирует систему линейных типов , основанную на количественной теории типов . В настоящее время она составляет в схему и C .
Смотрите также
использованная литература
внешние ссылки
- Домашняя страница Idris , включая документацию, часто задаваемые вопросы и примеры
- Идрис в репозитории Hackage
- Документация по языку Idris (учебник, справочник по языку и т. Д.)