Решение ООП-задач на языке Haskell
Как-то однажды знаменитый учитель Кх Ан вышел на прогулку с учеником Антоном. Надеясь разговорить учителя, Антон спросил: «Учитель, слыхал я, что объекты — очень хорошая штука — правда ли это?» Кх Ан посмотрел на ученика с жалостью в красных от боли глазах и ответил: «Глупый ученик! Объекты — всего лишь замыкания для бедных.»
Пристыженный Антон простился с учителем и вернулся в свою келью, горя желанием как можно скорее изучить замыкания. Он внимательно прочитал все статьи из серии «Lambda: The Ultimate», и родственные им статьи, и написал небольшой интерпретатор Scheme с объектно-ориентированной системой, основанной на замыканиях. Он многому научился, и с нетерпением ждал случая сообщить учителю о своих успехах.
Во время следующей прогулки с Кх Аном, Антон, пытаясь произвести хорошее впечатление, сказал: «Учитель, я прилежно изучил этот вопрос, и понимаю теперь, что объекты — воистину замыкания для бедных.» В ответ Кх Ан яростно огрел Антона палкой и воскликнул: «Когда же ты чему-то научишься, бездарь? Замыкания — это объекты для бедных!»
В эту же секунду Антон обрел просветление.
Моё послесловие к этой древней программистской притче таково:
В статически типизированных языках все не так кучеряво. Объект и замыкание — вещи пересекающиеся, но не идентичные — проблемы, как обычно, начинаются при наследовании с более чем одним уровнем иерархии.
А теперь собственно центральная ссылка (отчасти, пример слегка демотивирует — выглядит громоздко и нечитаемо по сравнению с ООП-версией):
Рассмотрим типичную задачу, из тех, что обычно считаются «ООП-эшными». Имеется список данных (объектов) имеющих не одинаковые структуры (по научному, гетерогенный список), при чём, над каждым нужно выполнять одинаковые действия — по простому, каждый можно передать в некую функцию. Первое, что приходит на ум — элементы GUI, но для примера они не годятся, понадобится подключать большие пакеты и слишком много места займёт код, к сущности ООП в Haskell отношения не имеющий.
А вот и дополнительные интересные ссылки по теме ФП:
Ключевики для нелюдей: функциональное программирование и объекты, а также ООП для использования Хаскеля, о котором я писал уже там. Специфика программирования и лямбды и замыкания, которые позволяют использовать рекурсии и циклы.