Я начинаю погружаться в программирование с зависимой типизацией и обнаружил, что языки Agda и Idris наиболее близки к Haskell, поэтому я начал там.
Мой вопрос: каковы основные различия между ними? Являются ли системы типов одинаково выразительными в обеих из них? Было бы здорово провести всеобъемлющий сравнительный анализ и обсудить преимущества.
Я был в состоянии заметить некоторые:
- У Idris есть классы типов по типу Haskell, тогда как Agda использует аргументы экземпляра
- Идрис включает монадическую и аппликативную нотацию
- Кажется, что у них обоих есть какой-то синтаксис, который можно переназначить, хотя они и не уверены, что они одинаковые.
Изменить : на странице Reddit есть еще несколько ответов на этот вопрос: http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/
agda
type-theory
idris
Serras
источник
источник
Ответы:
Возможно, я не лучший человек, чтобы ответить на этот вопрос, так как после внедрения Idris я, вероятно, немного предвзятый! В FAQ - http://docs.idris-lang.org/en/latest/faq/faq.html - есть что сказать, но об этом немного подробнее:
Idris был спроектирован с нуля для поддержки программирования общего назначения перед доказательством теорем, и, как таковой, обладает высокоуровневыми функциями, такими как классы типов, нотация do, скобки идиом, списки, перегрузки и так далее. Idris ставит высокоуровневое программирование перед интерактивным доказательством, хотя, поскольку Idris построен на разработчике, основанном на тактике, существует интерфейс для интерактивного средства доказательства теорем, основанного на тактике (немного похоже на Coq, но не настолько продвинутое, по крайней мере, пока).
Еще одна вещь, которую Idris стремится поддерживать хорошо, - это реализация Embedded DSL. С Haskell вы можете проделать длинный путь с помощью нотации do, и вы можете сделать это с Idris, но вы также можете перепривязать другие конструкции, такие как привязка приложения и переменной, если вам нужно. Вы можете найти более подробную информацию об этом в руководстве, или полную информацию в этом документе: http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf
Еще одно отличие заключается в компиляции. Agda идет в основном через Haskell, Idris - через C. Существует экспериментальный сервер для Agda, который использует тот же сервер, что и Idris, через C. Я не знаю, насколько он хорошо поддерживается. Основной целью Idris всегда будет создание эффективного кода - мы можем сделать намного лучше, чем сейчас, но мы работаем над этим.
Системы типов в Agda и Idris очень похожи во многих важных отношениях. Я думаю, что основное отличие заключается в обработке вселенных. У Агды есть полиморфизм вселенной, у Идриса есть совокупность (и вы можете иметь и то, и
Set : Set
другое, если считаете это слишком ограничительным и не возражаете против того, что ваши доказательства могут быть необоснованными).источник
Еще одно различие между Идрисом и Агдой состоит в том, что пропозициональное равенство Идриса неоднородно, в то время как Агда однородно.
Другими словами, предполагаемое определение равенства в Идрисе будет:
в то время как в Агде, это
Л в определении Агды можно игнорировать, так как он имеет отношение к полиморфизму вселенной, который Эдвин упоминает в своем ответе.
Важным отличием является то, что тип равенства в Agda принимает два элемента A в качестве аргументов, в то время как в Idris он может принимать два значения с потенциально разными типами.
Другими словами, в Идрисе можно утверждать, что две вещи с разными типами равны (даже если это оказывается недоказуемым утверждением), тогда как в Агде само утверждение является бессмысленным.
Это имеет важные и широкие последствия для теории типов, особенно в отношении возможности работы с теорией гомотопических типов. Для этого гетерогенное равенство просто не будет работать, потому что оно требует аксиомы, которая не согласуется с HoTT. С другой стороны, можно сформулировать полезные теоремы с неоднородным равенством, которые не могут быть прямо сформулированы с однородным равенством.
Возможно, самый простой пример - ассоциативность конкатенации векторов. Заданные списки с индексами длины называются векторами, определенными следующим образом:
и конкатенация со следующим типом:
мы можем доказать, что:
Это утверждение бессмысленно при однородном равенстве, потому что левая часть равенства имеет тип,
Vect (n + (m + o)) a
а правая часть имеет типVect ((n + m) + o) a
. Это совершенно разумное утверждение с неоднородным равенством.источник
(n + (m + o))
и((n + m) + o)
по суждению равны по ассоциативности+
поℕ
(выведено из принципа индукции). Соответственно, каждая сторона равенства имеет один и тот же тип. Разница между типами равенства важна, но я не вижу, как это является примером этого.