Sunday, 3 October 2010

skiminok: (Compas)
Главный вопрос, который встает в голове в процесс подготовки курса функционального программирования для ИПСА: "Начинать курс с лямбда-исчисления либо с примеров реального применения F#?" В принципе, я спокойно могу построить программу курса в любом из двух вариантов, да и примеры лекций в обоих ипостасях имеются: с одной стороны Евгений Кирпичев и Харрисон, с другой Лука Болоньез, Дон Сайм и Эрик Мейер. И SICP, конечно же, но у них курс не по ФП как таковому.

Попытаюсь выделить плюсы и минусы каждого из "дебютов" в одной систематизации, основываясь на "черновой" версии курса, прочитанной в мае 2010 года олимпийцам-лицеистам.

Лямбда-исчисление:
  +  Наглядно представляется идея "functions are data", а также карринга.
  +  Можно поиграться с различным порядком применений, показать, чем отличаются аппликативный и нормальный и к каким результатам это приводит. На языке программирования это менее очевидно.
  +  Можно сделать отступление на тему "Как это все появилось и сколько ему лет", упомянуть Черча, Шейнфинкеля, Карри, Тьюринга, Кантора, Геделя и прочую CS-компанию.
  -  Большое количество "матана" с первого же занятия отпугивает аудиторию.
  -  Практическое применение совершенно непонятно. Я поллекции говорю красивые слова про параллелизацию, отладку и чистоту, однако в реальности это совсем неочевидно. А слова о читабельности вообще кажутся враньем.

Практический язык:
  +  Можно сразу начать кодить простые программки, экспериментировать с примерами на "непривычном" языке и т.д.
  +  Видно практическое применение. Видна современность, в отличие от большинства институтских курсов, как для "обычного студента".
  +  На первых порах хорошо проводить аналогии с традиционными императивными идиомами, подчеркивать отдельные минусы последних.
  -  Придется отвлекаться на синтаксические моменты, мало связанные с предметом ФП: вывод типов и паттерн-матчинг, к примеру.
  -  Говорить о замыканиях и лямбда-функциях становится сложнее, нужно больше времени на понимание.

Разумеется, какой бы дебют я не избрал, оба предмета будут обязательно присутствовать в курсе: в первом случае F# начнется уже со второго занятия, во втором о лямбда-исчислении надо будет поведать где-то в середине, при разговоре о комбинаторах. Вопрос в том, с чего начинать для большего интереса аудитории.

(Стоит отметить, что минимум треть вводного занятия я в любом случае посвящу общему рассказу "Зачем это нужно, с чем его едят, плюс примеры реальной полезности". Однако меня пугает мысль, что обильное количество "матана" в виде чистого лямбда-исчисления может нивелировать Wow-эффект.)

Ну и конечно же, без важного "матана" курс попросту не будет существовать: обязательно нужны, помимо лямбда-исчисления: моноиды, гомоморфизмы на списках и АТД, монады (если успею). Но все это где-то в середине, для тех, кто заинтересовался, остался и хочет быть полностью в теме. Сейчас же, повторюсь, речь идет конкретно о дебютном занятии. В целом, вопрос на 40% психологический, нежели математический.

Кто как считает? Выскажите свою точку зрения.

Profile

skiminok: (Default)
skiminok

Most Popular Tags

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
242526272829 30
31