← All posts tagged fp

Macil
programming Scheme fp С интересом узнал о существовании Chibi-Scheme (http://code.google.com/p/chibi-scheme/). Жалко, что не работает под виндой. А то просто идеальное средство для разработки кросс-платформенных зловредов!
Macil
Haskell fp Вычитал в древней конфе термин applicative programming, много думал. Потом много гуглил. А потом много думал… Интересная штуковина на самом деле получается!
С ясен пень, что функциональное программирование (в смысле программирования с помощью функций высших порядков) – аппликативное. Казалось бы, тавтология. Раз функциональное – значит аппликативное, раз аппликативное – значит функциональное. А вот хренушки! Функции высших порядков, точнее их суррогаты (поскольку там и функций-то никаких нет, только процедуры), есть где угодно. В ООП помимо всего прочего, объект по сути дела позволяет управлять вычислительным контекстом… Ну и пофиг на то, что функции некаррированы. Нахрен нужно каррирование, если нет типа «->» и если нет вывода типов? Да что там тип «->»? Вообще статической типизации может и не быть. Это, как и наличие сайд-эффектов не мешает использовать элементы функционального программирования. И довольно эффективно использовать.
А все дело именно в аппликативной составляющей. Нет, понятно, что все императивные языки подчиняются алгебраической нотации, поэтому в какой-то степени аппликативны. Ключевым понятием здесь является «в какой степени». Понятно, что функциональное программирование аппликативно… Но насколько? Вот в чем вопрос…
Наверное, самой главной чертой аппликативного программирования является управление вычислимостью, т.е. мы можем создавать свои собственные управляющие конструкции. Второй чертой является наличие некоего «комбинаторного» слоя в программе, где мы не столько реализуем целевой функционал, сколько определяем каким образом взаимодействуют между собой куски программы. Из первых двух признаков вытекает третий: отсутствие сайд-эффектов, т.е. аппликативность в исконном значении. Из всего вышеперечисленного, вытекает четвертый: развитая система типов, статическая, с выводом, сделанная по теории типов. Почему? Да потому что в противном случае создать реальную аппликативную программу будет невозможно.
Зачем все это? Например, монады являются инструментом не функционального, а аппликативного программирования. Потому что они как раз обеспечивают еще один слой в логике программы: на уровне «контейнерного» типа (алгебраического типа, функтора) описывается логика взаимодействия. На уровне типа «a», описывается непосредственный функционал. Всякие return и lift – «мостики» из «обычной» логики программы в «комбинаторную». Монадические трансформеры – «мостики» из одной «комбинаторной» логики программы в другую.
С тех же позиций лучше объяснять GADT и семейства типов. С тех же позиций нужно обосновывать преимущества Хаскеля, Окамла, Скалы.