воскресенье, 24 мая 2009 г.

Функциональное программирование: обучить легко!

Очень интересный пост воссоздал Джек Коф по следам научения своего восьмилетнего сына программированию. Начал он - что наиболее отрадно - с функционального подхода.  Испытывалось обучение на ребёнке, но сама концепция, поданная в очень доступной форме, может сыграть на руку и взрослому человеку, который хочет проникнуться функциональной идеей.

Я попытаюсь кратко пробежать по всем ярким эпизодам "учебного процесса".


Итак, основным понятием программирования является действие, или функция. Функция представляет собой некий чёрный ящик (все представили огромных размеров коробок), у которого в одной стороны находится вход, а с другой - выход. Автор приводит следующий пример. Пусть будут гуси,  которые направляются внутрь этого ящика, исчезают в его закоулках, и выходят, но уже немного другими. Были они обычными гусями, а стали расписными: теперь на пузе красуются звёзды. Очевидно, что у ящика есть цель - разукрашивать гусей, и он с этим прекрасно справляется. А могла бы быть другая - стирать нацарапанные на животах звёзды. Тоже функция, чем не оная?

Гусь - > [Окрасить] - > Гусь со звездой на пузе.



Пожалуй, концепция понятна. Переходим к примерам.

Надо к некоторому числу прибавить, скажем, пять (+5). Что в этом случае?

10 - > [+5] - > 15



Убавить число?

10 - > [-5] - > 5



Усложним задачу: на вход подаётся два числа, нужно определить их сумму.

(7, 2) - > [+] - > 9



или вычесть

(7, 2) - > [-] - > 5



А если, например, требуется определить максимальное (минимальное) число из двух заданных?

(8, 1) - > [наибольшее] - > 8


(8, 1) - > [наименьшее] - > 1



Равны числа?

(4, 3) - > [равенство?] - > НЕТ!


(3, 3) - > [равенство?] - > ДА!



Переходим к логике. Что с событиями? Здесь размышляют так. Об одновременности (AND) событий можно говорить в том случае, когда соблюдены все условия; то есть, успех зависит от всех факторов:

(ВКЛ, ВКЛ) - > [AND] - > ВКЛ


(ВЫКЛ, ВКЛ) - > [AND] - > ВЫКЛ



Возможность - достаточность - (OR) лишена таких жестких ограничений. Успех здесь зависит от удовлетворения хотя бы одного фактора:

(ВЫКЛ, ВКЛ) - > [OR] - > ВКЛ



Аналгогия - водопровод с двумя вентилями. Если они расположены последовательно, то для протекания воды нужно одновременное открытие этих вентилей. Если параллельно - достаточно открытия одного из них.

Дальше можно покомбинировать функциями - ящиками - для, например, сравнения двух сумм:

{(4, 3) - > [ + ] - > 7}, {(1,2) - > [ + ] - > 3} - > [равенство?] - > НЕТ! // 7 не равно 3



Осветив основные правила, можно перейти к весьма важному понятию - типизации. В случае сложения какие типы данных участвовали в преобразовании? Численные на входе, численные на выходе. В случае проверки равенства - иначе - на выходе булевый тип. То есть: функция выполняет некоторое действие, даёт ответ на вопрос, причём вопрос сформулирован в определённой форме (используя свои типы данных), а ответ - в своей форме (для него результат также закреплён за своим типом данных).

Джек Коф был убедителен, а его сын (восьмилетний!) внимателен; он постиг вот эти базовые концепции. Но кое-что осталось нетронутым: передача внутрь чёрных ящиков других коробков и коробочков, которые тоже вносят свой вклад в общее дело, спланированное умом изощрённого ума.  Но об этом позже.

Комментариев нет: