2012-05-25 5 views
9

Возможно ли отключить или обойти систему типов в Haskell? Бывают ситуации, когда удобно иметь все нетипизированное, как в Forth и BCPL, или монотипно, как в Mathematica. Я подумываю о том, чтобы объявить все как один и тот же тип или вообще отключить проверку типов.Haskell без типов

Редактировать: В соответствии с принципами SO это узкий технический вопрос, а не просьба обсудить относительные достоинства различных подходов к программированию. Чтобы перефразировать вопрос: «Можно ли использовать Haskell таким образом, чтобы избежать конфликтов типа, полностью отвечающих программисту?»

+9

[no] (http://dmwit.com/bacteria/grumpy.jpg) –

+6

Удобно, возможно. Но учтите, что любое решение, которое вы используете, не будет культурно идиоматическим Haskell, которое всегда строго типизировано. Я предлагаю вам оставить свои «неудобства» позади и изучить его в соответствии с культурными нормами - как только вы проведете некоторое время с ним, все встанет на свои места, и вы будете удивляться, почему вы считали, что вам нужно отключить проверку типов. – luqui

+3

+1 для использования «культурно-нормативной» в ответе на вопрос программирования. –

ответ

7

Также обратите внимание на Data.Dynamic, который позволяет иметь динамически типизированные значения в частях вашего кода, не отключая проверку типов на всем протяжении.

+0

Конечно, все равно будут возникать ошибки при попытке манипулировать данными, значение которых не имеет смысла в любом контексте. например пытаясь добавить строку к int. Я не думаю, что этот модуль изменит это. – Wes

+0

Я попробую попробовать. – user287424

8

GHC 7,6 (еще не выпущен) имеет аналогичную функцию, -fdefer-type-errors:

http://hackage.haskell.org/trac/ghc/wiki/DeferErrorsToRuntime

Он будет отложить все ошибки типа до времени выполнения. Это не совсем нетипизируется, но позволяет почти такую ​​же свободу.

+5

As Pubby отмечает, это * не * то же самое, что и динамическая типизация. Конкретно, разница заключается в следующем: предположим '-fdefer-type-errors' и рассмотрим функцию' addOne :: a -> a', определенную 'addOne x = x + 1'.У этого явно есть ошибка типа, и называть его как 'addOne 'x" 'будет ошибкой соответствующим образом. Тем не менее, 'addOne (1 :: Int)' будет (как я понимаю) * также * ошибка: даже если в этом случае код будет работать случайно, * он по-прежнему ошибочен *, и вы получите сообщение об ошибке * будут * получены во время компиляции. –

+2

Он не обеспечивает свободу от системы типов. Он не предназначен для отключения системы типов, просто задерживайте ее, если соответствующая ошибка не относится к 'main' во время компиляции. – rotskoff

7

Даже с fdefer-type-errors не следует избегать системы типа. Это также не позволяет независимость от типа. Точка флага - разрешить компиляцию кода с ошибками типа, если ошибки не вызываются функцией Main. В частности, любой код с ошибкой типа, когда он фактически вызывается интерпретатором Haskell, по-прежнему терпит неудачу.

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

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

+0

Для заинтересованных двух основных областей применения, где это имеет значение, являются поисковое программирование (например, исследование ИИ) и символическая математика. См. Обсуждение среди Lispers, которые попробовали Haskell, но переключились обратно из-за системы типов. См. Обсуждение компьютерной алгебры о том, почему сильно типизированная система Axiom не получила признания среди математиков. – user287424

+0

Примечание: Вышеупомянутая формулировка «Точка флага заключается в том, чтобы разрешить компиляцию кода с ошибками типа, если ошибки не отображаются в Main. В частности, любой код с ошибкой типа при вызове во время выполнения будет по-прежнему потерпеть неудачу." является неопределенным и потенциально обманчивым. Я., что значит «появляться в« Главном »и« вызывать во время исполнения »? См. [Документ] (http://dreixel.net/research/pdf/epdtecp_draft.pdf) для лучшей интуиции. Например. 'fst (True, 'a' && False)' оценивает значение 'True', после перевода на' fst (True, ошибка «Ошибка типа: не соответствует Char с Bool») '. – ntc2

+0

С другой стороны, см. 'AddOne' [ниже] (http://stackoverflow.com/questions/10747703/haskell-without-types#comment13967400_10747745) для примера, где вы можете не ожидать ошибки, но получить ее. Таким образом, лучшее резюме может быть следующим: ошибки типа локализуются (помещаются в листья дерева выражений) максимально (эвристически), а затем заменяются на вызовы 'error'. Лесткая оценка Haskell означает, что эти вызовы ошибок не срабатывают, если во время выполнения (head) значение их выражений не требуется. – ntc2

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