Lambda calculus vs. Real World
Sunday, 3 October 2010 17:28Главный вопрос, который встает в голове в процесс подготовки курса функционального программирования для ИПСА: "Начинать курс с лямбда-исчисления либо с примеров реального применения F#?" В принципе, я спокойно могу построить программу курса в любом из двух вариантов, да и примеры лекций в обоих ипостасях имеются: с одной стороны Евгений Кирпичев и Харрисон, с другой Лука Болоньез, Дон Сайм и Эрик Мейер. И SICP, конечно же, но у них курс не по ФП как таковому.
Попытаюсь выделить плюсы и минусы каждого из "дебютов" в одной систематизации, основываясь на "черновой" версии курса, прочитанной в мае 2010 года олимпийцам-лицеистам.
Лямбда-исчисление:
+ Наглядно представляется идея "functions are data", а также карринга.
+ Можно поиграться с различным порядком применений, показать, чем отличаются аппликативный и нормальный и к каким результатам это приводит. На языке программирования это менее очевидно.
+ Можно сделать отступление на тему "Как это все появилось и сколько ему лет", упомянуть Черча, Шейнфинкеля, Карри, Тьюринга, Кантора, Геделя и прочую CS-компанию.
- Большое количество "матана" с первого же занятия отпугивает аудиторию.
- Практическое применение совершенно непонятно. Я поллекции говорю красивые слова про параллелизацию, отладку и чистоту, однако в реальности это совсем неочевидно. А слова о читабельности вообще кажутся враньем.
Практический язык:
+ Можно сразу начать кодить простые программки, экспериментировать с примерами на "непривычном" языке и т.д.
+ Видно практическое применение. Видна современность, в отличие от большинства институтских курсов, как для "обычного студента".
+ На первых порах хорошо проводить аналогии с традиционными императивными идиомами, подчеркивать отдельные минусы последних.
- Придется отвлекаться на синтаксические моменты, мало связанные с предметом ФП: вывод типов и паттерн-матчинг, к примеру.
- Говорить о замыканиях и лямбда-функциях становится сложнее, нужно больше времени на понимание.
Попытаюсь выделить плюсы и минусы каждого из "дебютов" в одной систематизации, основываясь на "черновой" версии курса, прочитанной в мае 2010 года олимпийцам-лицеистам.
Лямбда-исчисление:
+ Наглядно представляется идея "functions are data", а также карринга.
+ Можно поиграться с различным порядком применений, показать, чем отличаются аппликативный и нормальный и к каким результатам это приводит. На языке программирования это менее очевидно.
+ Можно сделать отступление на тему "Как это все появилось и сколько ему лет", упомянуть Черча, Шейнфинкеля, Карри, Тьюринга, Кантора, Геделя и прочую CS-компанию.
- Большое количество "матана" с первого же занятия отпугивает аудиторию.
- Практическое применение совершенно непонятно. Я поллекции говорю красивые слова про параллелизацию, отладку и чистоту, однако в реальности это совсем неочевидно. А слова о читабельности вообще кажутся враньем.
Практический язык:
+ Можно сразу начать кодить простые программки, экспериментировать с примерами на "непривычном" языке и т.д.
+ Видно практическое применение. Видна современность, в отличие от большинства институтских курсов, как для "обычного студента".
+ На первых порах хорошо проводить аналогии с традиционными императивными идиомами, подчеркивать отдельные минусы последних.
- Придется отвлекаться на синтаксические моменты, мало связанные с предметом ФП: вывод типов и паттерн-матчинг, к примеру.
- Говорить о замыканиях и лямбда-функциях становится сложнее, нужно больше времени на понимание.
Разумеется, какой бы дебют я не избрал, оба предмета будут обязательно присутствовать в курсе: в первом случае F# начнется уже со второго занятия, во втором о лямбда-исчислении надо будет поведать где-то в середине, при разговоре о комбинаторах. Вопрос в том, с чего начинать для большего интереса аудитории.
(Стоит отметить, что минимум треть вводного занятия я в любом случае посвящу общему рассказу "Зачем это нужно, с чем его едят, плюс примеры реальной полезности". Однако меня пугает мысль, что обильное количество "матана" в виде чистого лямбда-исчисления может нивелировать Wow-эффект.)
Ну и конечно же, без важного "матана" курс попросту не будет существовать: обязательно нужны, помимо лямбда-исчисления: моноиды, гомоморфизмы на списках и АТД, монады (если успею). Но все это где-то в середине, для тех, кто заинтересовался, остался и хочет быть полностью в теме. Сейчас же, повторюсь, речь идет конкретно о дебютном занятии. В целом, вопрос на 40% психологический, нежели математический.
Кто как считает? Выскажите свою точку зрения.
(Стоит отметить, что минимум треть вводного занятия я в любом случае посвящу общему рассказу "Зачем это нужно, с чем его едят, плюс примеры реальной полезности". Однако меня пугает мысль, что обильное количество "матана" в виде чистого лямбда-исчисления может нивелировать Wow-эффект.)
Ну и конечно же, без важного "матана" курс попросту не будет существовать: обязательно нужны, помимо лямбда-исчисления: моноиды, гомоморфизмы на списках и АТД, монады (если успею). Но все это где-то в середине, для тех, кто заинтересовался, остался и хочет быть полностью в теме. Сейчас же, повторюсь, речь идет конкретно о дебютном занятии. В целом, вопрос на 40% психологический, нежели математический.
Кто как считает? Выскажите свою точку зрения.