пятница, 10 апреля 2009 г.

\lambda и мэйнстрим

\lambda и мэйнстрим
Хочется высказаться на счет текущего состояние ФП и то, что понимается мейнстримом (скорее всего все выпады пойдут в сторону ms).
Для кого предазначено это сообщение? Если вы лично знакомы с Д. Скоттом, Per Martin-Lof (не знаю как правильно по-русски), ну, или хотя бы Ф. Вадлером; вас не пугает импредикативный полиморфизм(хотя я уже забыл что это :), но созвучно с синхрофазатроном); между словами морфизм и монада вы найдете что-то более общее чем общая первая буква "м", и что все тот же морфизм не имеет ничего общего со всякими *-измами (капитализм, марксизм, ...) ... - дальше вы можете не читать, все равно ничего нового вы здесь не узнаете.
Начнем с определений и операций. 
Определение можно прочитать в любой книжке по \lambda-исчислению. :) Что понимается под \lambda-ой в ms я лично не знаю, хотя в msResearch есть несколько вменяемых людей, кто смог бы им объяснить.
Имееется понятие нормальной формы, редукции. \lambda-выражение можно редуцировать, до тех пор, пока не придем к нормальной форме (выражение, которые уже нельзя редуцировать). Например, 4 - это нормальная форма. f - "обычно" тоже (просто функция), а f 4  - можно вычислять.
Есть две "вспомогательные" редукции: \alpha, \mu (если не ошибаюсь). Первая - переименование свободных переменных, вторая - если функции равны, то и равны их значения, вычисленные на одних аргументах.
Основная - \beta-редукция. Просто подстановка (ну, или чуть сложнее, из-за коллизии переменных).
Есть еще оператор неподвижной точки, для целей рекурсии. Иначе бы все было бы плоско. Так же имеются несколько примитивов (типа, if, равенства, арифметики).
В с#(3) с "\lambda-ой" можно сделать только одну вещь - откомпилировать в delegate. :) А у него тоже не слишком много свободы, его можно только вычислить (invoke). По смыслу, делегат - замыкание (closure). Изменив свободную переменную в определении делегата, мы тем самым изменим следующий invoke.
В ФП, как всем известно, функции являются объектами первого уровня. То есть их можно *нормально* использовать: создавать, передавать как аргумент и прочее.  Там это очень удобно и красиво. При наличия таких простых вещей как карринг, вывод типов все становится (опять же) очень лаконично. Примеры тут.
А ms хочет ввести понятие "\lambda" уже в С/++(2010). :) . Осенизаторскую машину ложкой меда не исправить. F# - получился как породия на ocaml, но все-равно императивный. Какие-то попытки добавить в некоторые фенечки к C# все равно ни к чему позитивному не приведут. Был бы смысл разделить императивный код и *точно ФП код* (хотя бы просто атрибутами), но side-effect всегда можно получить, ибо рефлексия. C-шный const отказались делать в шарпе, так как, типа, всегда можно низкоуровнево (*void) хоть куда в памяти записать. Msil && .net по определению процедурно-объектны (настоящее ООП, имхо в акторной модели, тот же Smalltalk, но это отдельный флейм). Даже тот делегат выбивается из общей картины. Жабовские анонимные классы, взамен делегатам, и то как-то в теме (полагаю, преследовали одну цель). 
В современном ФП (да какое оно там современное? та же Miranda, *ML,  пред- и пост- haskell-ные - конец 80, начало 90-хх) никакие дженерики, препроцессоры, никакие проблемы с типами (понятие cast-exception просто отсутствует, ибо негде), никакой мутабельности, все строго по теории. Просто думать надо по-другому.
Что я тут хотел сказать... Теперь уже и не знаю: слишком много хочется хочется сказать, только что-то не связно (без цели) получается. Переубеждать кого-то в споре ФП vs. императивщина - это банальщина. Что в мейнстриме ФП не будет пока еще лет 10 - это точно. Что уже лет 10 есть довольно вкусные экземляры ФП. Что современные реализации ФП довольно далеки от теории (в реализациях еще копать и копать), но там *такие* абстракции, что программистам оно и не надо (и не снилось) (те же \lambda-кубы, и высших размерностей :) ).  Что когда ms говорит, что это ФП и все будет рулез, то продолжайте жевать свой гамбургер и запевайте кака-колой.

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