Geniepro писал(а):
В языках с зависимыми типами неправильная программа не скомпилируется, даже если в ней нет синтаксических ошибок. Вот неправильный алгоритм, и всё тут, так чего его запускать на выполнение...
Охохонюшки...
Вот если бы ещё народ научить добросовестно строить оте самые иерархии зависимых типов...
А то ведь народ в массе своей способен только кипятком писать по поводу насыщенности ужЕ имеющихся библиотек...
УжЕ и шутка про джавистов пошла:
- Сколько Вам нужно времени, что бы решить эту задачу?
- Эту задачу решить нельзя: для неё нет библиотеки!
С другой стороны...
Я прекрасно понимаю, что Вы тонко намекаете на автоматический вывод типов в Хаскеле...
Но, в последнее время, я осознал, что простое описание типа аки некоего списочного описания неких сигнатур экспортируемых типом сучностей разной природы неполно и "однобоко"...
Получается интересный парадоксик: деклараративность применять при описании статики получается? - хорошо! Но мне нужна динамика (процесс в развитии)! Декларировать протокол можем? - да - пожалуйста - тем же подобием РБНФ! Но теперь нам и на фиг не нужно описание класса в классическом варианте (набор экспортируемых методов)...
Что нам давала декларация типов в классике?
Да, почти ничего! Обычно-то и проверка на совместимость-то типов сущостей происходила по сопоставлению имени типа и по именам наследников... "Структурность" (истинность "принадлежности типу") проверялась на этапе компиляции по наличию в типе соответствующего метода (по сигнатуре). "Своевременность" вызова метода НИКАК нельзя проверить!
С "протокольными" описаниями ситуация прямо противоположная.
В принципе, классическое описание интерфейсов - частный случай описаний протокола взаимодействия: просто методы есть "выхваченные куски" из последовательности актов взаимодействия. Но протокольное описание - БОЛЕЕ естественно, МЕНЕЕ ущербно, да ещё и кучу всяческих удобств для исследований и оптимизации даёт.
Вызов метода - фрагмент акта обмена. Но если в протокольном описании мы чётко определяем последовательность прохождения и обмена "кусков информации" между общающимися объектами, то при вызове методов (при классическом описании интерфейсов) этого нет. Более того, мы даже вынуждены в высокоуровневое общение сущностей нашей предметной области вносить, например такие детали, как последовательность занесения аргументов в регистры и стек исполняющей системы...
По аналогии с минимизацией и изоморфными преобразованиями описаний грамматик, мы можем заняться оптимизацией и преобразованиями описаний протоколов...
И т.д. ...