Здравствуйте, nikov, Вы писали:
N>Я всегда был убеждённым сторонником статической типизации. Но я регулярно сталкиваюсь с тем, что системы типов, хотя и помогают отлавливать многие ошибки, также отвергают вполне безопасный код (впрочем, это хорошо известный теоретический факт).
Вроде как это вполне естественное поведение. Какой бы крутой ни была система типов, все равно найдется примерчик, который она разгрызть не сможет. Это даже если смотреть на проблему с позиции, когда код в принципе можно типизировать, но на практике конкретная система типов его отвергнет. А ведь бывают и ситуации, когда код статически типизировать нельзя — например, тип функции может зависеть от рантайм-значений, и в одной ситуации это, скажем, a->b, а в другой — a->b->c, причем все зависит от того, какое *значение* будет у второго аргумента.
В Ela, например, есть библиотечка espec, которая реализует DSL для тестов, и спецификация теста выглядит так:
test1 =
test "Demonstration of espec"
given [1..5]
should contain 1
shouldn't contain 3
shouldn't contain 6
when reverse
should be [5,4..1]
when tail
should be [3,2..1]
when head
should be 4
Обычный хаскелевый синтаксис
Здравствуйте, Воронков Василий, Вы писали:
ВВ> А ведь бывают и ситуации, когда код статически типизировать нельзя — например, тип функции может зависеть от рантайм-значений, и в одной ситуации это, скажем, a->b, а в другой — a->b->c, причем все зависит от того, какое *значение* будет у второго аргумента.
В зависимых типах можно же.
ВВ>В Ela, например, есть библиотечка espec, которая реализует DSL для тестов, и спецификация теста выглядит так:
ВВ> should be [5,4..1]
ВВ> when tail
ВВ> should be [3,2..1]
Баги, баги.. Не, не заменят тесты типов.
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, Воронков Василий, Вы писали:
ВВ>> А ведь бывают и ситуации, когда код статически типизировать нельзя — например, тип функции может зависеть от рантайм-значений, и в одной ситуации это, скажем, a->b, а в другой — a->b->c, причем все зависит от того, какое *значение* будет у второго аргумента.
DM>В зависимых типах можно же.
В зависимых типах зависимость будет от типов, а не от рантайм-значений.
ВВ>>В Ela, например, есть библиотечка espec, которая реализует DSL для тестов, и спецификация теста выглядит так:
ВВ>> should be [5,4..1]
ВВ>> when tail
ВВ>> should be [3,2..1]
DM>Баги, баги.. Не, не заменят тесты типов.
Если ты про ошибку внутри теста, то она нарочитая — пример взят из доки, как раз показывает поведение теста в случае, когда ассерты падают. Кстати, как бы статическая типизация помогла в подобном случае? Ведь с типами-то все в порядке =)
Вообще мне довольно много приходится программировать на динамических языках, причем не самых лучших — JavaScript, Lua. Могу сказать, что нет каких-то заметных проблем с ошибками типов. В той же Луа до фига проблем, связанных с особенностями Луа ("юникодные" строки, например), но вот ошибки типа встречаются весьма редко. Да и, честно говоря, ревнители статической типизации зачастую забывают, что ООП мейнстримный — это уже наполовину динамика. Да и куча задач в проекте фактически приводит к тому, что у нас понятие статического типа низводится, скажем, до XML схемы, которая валидируется в рантайме или вообще каких-то рукопашных пассов, причем никто особо не страдает от этого.
Так ли страшен черт, как его малюют?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>В зависимых типах зависимость будет от типов, а не от рантайм-значений.
Неправда, даже в этой самой теме я уже показывал пример обратного:
http://rsdn.ru/forum/philosophy/5261900?tree=treeАвтор: D. Mon
Дата: 15.08.13
Зависимые типы зависят именно что от значений, а не только от типов.
ВВ>Если ты про ошибку внутри теста, то она нарочитая
А, ок.
ВВ>Так ли страшен черт, как его малюют?
Это вечная тема, и в некотором смысле религиозная, я не уверен, что хочу сейчас в нее ввязываться.