2011-01-08 3 views
12

Какой из зависимых типов языки программирования могут быть использованы для разработки приложений реального мира?В зависимости от типа языка, наиболее подходящего для программирования «реального мира»?

Вот некоторые пункты, которые я думаю, что важно:

  • документация
  • примеры программ
  • стандартная библиотека
  • или, по крайней мере, простой в использовании внешней функции интерфейса
  • сообщество людей, использующих язык для реальных задач
  • поддержка инструмента
+0

Может быть лучше подходит для программистов.stackexchange.com ... – ChristopheD

+0

Любой из них может быть использован. Вам нужно предоставить больше контекста для вашего вопроса. – jzd

+0

Что относительно полноты Тьюринга? Это тоже требование? Также, когда вы говорите «задачи реального мира», вы имеете в виду «разрабатывать приложения», а не «доказывать теоремы», правильно? – sepp2k

ответ

5

Я бы предложил Agda, так как он имеет совместимость с Haskell. Таким образом, это, вероятно, зависит от типизированного языка с лучшими библиотеками. Документация и учебники немного тусклые, хотя и поддержка инструментов тоже не слишком велика. Честно говоря, большинство зависимых языков не очень полно развиты на данный момент.

Если вы столкнулись с чуть более слабым спросом на то, что ваш язык должен иметь GADT's, есть два очень хорошо сохранившихся варианта: Scala и Haskell. ИМХО вы получаете большую часть преимуществ зависимых типов с помощью GADT, и вы сохраняете typechecking разрешимым для загрузки.

Scala и Haskell имеют большие и хорошо документированные библиотеки, рабочую цепочку инструментов, а также FFI (для Java и C соответственно). У обоих также есть сообщества, которые используют их для решения реальных проблем, например parsing и webdevelopment.

+0

Я использую scala некоторое время, но я не использовал GADT. Как они относятся к зависимым типам? –

+0

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

+1

Для справки, OCaml теперь также поддерживает GADT. –

6

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

16

Принятый ответ содержит дезинформацию. Typechecking в Agda разрешима, если вы не отключите проверку положительности/завершения/юниверса. Более того, бесконечные процессы программируются в Agda, так же как IO-процессы программируются в Haskell: единственным ограничением является то, что бесконечные процессы не могут разворачиваться неограниченно при выполнении в процессе проверки типов. Вы можете реализовать симулятор машины Тьюринга в Агда: вы просто не можете сказать ложь, что гарантированно прекратите или убедите typechecker запустить его неограниченно.

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

Идрис, как предложил Твай, является ближайшим кандидатом на «реальный мир», на котором набирается язык. Это гораздо больше сосредоточено на том, чтобы сделать вещи, чем Агда. Я бы порекомендовал Agda как лучший инструмент для того, чтобы справиться с идеями, лежащими в основе программируемого программирования, но Idris - более практичный вариант.

Это, я рад сказать, стоит рассмотреть недавние выпуски Haskell в качестве кандидата в этой дискуссии. Начиная с GHC 7.4, Haskell начал поддерживать полезное представление данных типа уровня и, по крайней мере, singleton (kludge, хотя это и есть), мы можем действительно иметь типы в зависимости от значений времени выполнения (за счет их зависимости от статических переменных ограничивается равными значениями времени выполнения). Таким образом, Haskell является реальным «реальным миром» на ранней стадии экспериментов с зависимыми типами.

+0

Спасибо за ответ. Как далеко продвигаются возможности Хаскелла? Похоже, это сопоставимо с Scala в этом отношении. –

+1

Я не знаю Scala достаточно хорошо, чтобы сделать это сравнение. Тем не менее, Haskell движется с довольно высокой скоростью в зависимости от типизированного направления. Добрый полиморфизм (как в GHC 7.6) позволяет эффективно работать со всеми новыми видами, создаваемыми путем автоматического продвижения типов к типу уровня. Моя ставка была бы на Haskell быть и оставаться впереди Scala в этом отношении, но я был бы счастлив быть доказанным неправильно. – pigworker

+0

Er, um, позвольте мне добавить, что разработка https://t.co/fB8sFizL из моего сообщения ICFP2012 http://www.youtube.com/watch?v=XGyJ519RY6Y - это упражнение, которое постепенно становится более навязчивым. Haskell может легко добраться до части 4, но часть 5 - это слишком много, на что можно надеяться. См. Также http://stackoverflow.com/questions/10656402/is-it-possible-to-program-and-check-invariants-in-haskell/10659438#10659438 для примера того, что возможно. – pigworker

Смежные вопросы