Разговор из аськи о функциональном программировании. Выкладываю здесь, т.к. может оказаться кому-то полезным.
Разговор сперва шел о различных WM, в частности XMonad, потом плавно переключился на ФП:
TundraGhost 29 августа 2008 18:16:38 с монадой проблема в том, что она на ЧИСТО функциональном языке написана. т.е. такую банальную вещь как "сделать, сначала то, а потом вот это" еще надо с непривычки сообразить как сделать androidoed 29 августа 2008 18:17:52 для этого просто надо освоиться в функ.программировании, это непросто, особенно если с этим серьёзно дел раньше не имел. Уже потом, когда врубишься и освоишься практикой, открываются неограниченные возможности TundraGhost 29 августа 2008 18:18:45 я вообще немного офигел, когда чуть по-подробнее с хаскеллом познакомился там функции вида например F( Int-> Float ) -> Float не редкость, а вообще обычное дело. т.е параметром функции должна передаваться функция, которая на входе получает определенный тип и возвращает другой определенный тип androidoed 29 августа 2008 18:18:57 фросто функциональная марадигма - настолько отличная от привычной императивной, насколько вообще это мыслимо TundraGhost 29 августа 2008 18:20:04 я даже не знаю как это выразить на привычном мыслительном процессе и соответственно нелегко сообразить как это вообще применять androidoed 29 августа 2008 18:20:37 это ещё цветочки. Когда вообще по незнакомому виду с ходу невозможно судить, что у тебя за элемент в списке: макрос, функция, ссылка (на константу, переменную (другой список), директива, позиционное имя....) гыгы androidoed 29 августа 2008 18:21:35 функ.языки вышли из ЧИСТОЙ высшей математики, здесь метода, освоенная на принципах машины Тьюринга, не уместна и только вредит :) TundraGhost 29 августа 2008 18:22:21 ага, начал читать валяющиеся в сети лекции по лямбда исчислению -- мозг кипит и крыша едет уже со страницы 3-5 =D androidoed 29 августа 2008 18:22:27 т.e. ничего не стоит прямо методами языка изобрести новый язык... androidoed 29 августа 2008 18:23:09 а лямбда-фунции - это ещё довольно простая для понимания вещь :) TundraGhost 29 августа 2008 18:23:11 дык так и делается -- определяешь несколько функций, вот у тебя уже готовые операторы нового языка androidoed 29 августа 2008 18:24:18 достаточно просто представить, что любую функцию можно разложить на лямбды, но на практике такое понимание не сильно помогает без понимания, зачем это нужно и как применить :) TundraGhost 29 августа 2008 18:24:37 это то да, но там какие-то теоретические выкладки про лямбда исчисление пошли с кучей новых терминов и непривычной записью по-математически. тяжело бывает просто понять, о чем речь идет -- я ж математику еще на 2 курсе окончил изучать TundraGhost 29 августа 2008 18:25:16 хотя и написано, мне кажется, вполне доступно для студентов-математиков androidoed 29 августа 2008 18:26:18 здесь нет какого-либо особого отличия, ЧТО ты определяешь. Никогда заранее неизвестно, что будет собой представлять некий список в следующий момент: может быть, это будет объявление функции, а может быть, и нет. Ты волен генерировать объявление функции в несколько этапов, динамически его изменять внутри программы, превращая функцию подчас в нечто заранее неизвестное :) TundraGhost 29 августа 2008 18:26:58 определяя функцию ты создаешь не метод, которым решаешь задачу, а сразу создаешь решение задачи androidoed 29 августа 2008 18:27:13 ну, это банальность :) TundraGhost 29 августа 2008 18:27:37 пока не встретишься с этих -- хрен поймешь, что это значит я вот уже понял, что раньше не понимал, что это значит =) TundraGhost 29 августа 2008 18:28:38 многомерные программы какие-то получаются в противоположность обычным плоским androidoed 29 августа 2008 18:30:05 а как тебе такое: на основании данных из СУБД сформировать функцию, при изменении данных в СУБД тело функции автоматически изменяется, вплоть до полной своей противоположности... формирование функции по кусочкам данных из разных источников, анонимные "летучие" функии, существующие только в момент своего вызова... функции, полностью состоящие из функций, даже имя... TundraGhost 29 августа 2008 18:30:49 ну анонимные функции то много где есть, хоть и не воспринимаются они там так androidoed 29 августа 2008 18:32:54 возьмёшь вот функцию, вызовешь, а она работает не так, как было задумано, но работает, и самое смешное - может сама себя на основании переданных параметров видоизменить, вернуть в качестве результата саму себя или, ещё хлеще, продолжать изменяться уже в твоём коде в ответ на события в твоём же коде TundraGhost 29 августа 2008 18:33:17 ха androidoed 29 августа 2008 18:34:37 А что касается анонимных функций, то вне функ.языков это понятие совсем другое, плоское и вводящее в заблуждение. Ведь "обычная" анонимная функция - вот она, она есть, мы её можем посмотреть в исходном коде.. А тут... Ты ещё получил, она выполнилась, но её не было до этого ни в коде, ни в памяти, и после выполнения её уже нет, так что нечего и вызывать будет :) TundraGhost 29 августа 2008 18:35:22 ну да, я ж говорю, обычные языки плоскими кажутся по сравнению с функциональными. androidoed 29 августа 2008 18:37:58 примитивным аналогом этого является функция eval в императивных языках. Но eval не даёт возможности по использованию своего аргумента: он просто выполнился - и всё, дальше с ним мы уже не сможем работать, сохраняя его (аргумента) работоспособноть, его как кода, строго говоря, вне функции eval не существует TundraGhost 29 августа 2008 18:37:59 причем, обычно когда про функциональные языки научно-популярно пишут обычно приводят примеры как сделать то, что уже реализовано в обычных языках. я че-то раньше не понимал смысла этого. а смысл в них -- сама реализация этих технологий базовыми средствами языка без особых мудреностей -- как один из многих примеров того, что на них можно делать TundraGhost 29 августа 2008 18:38:31 ага, мне в eval этого частенько не хватает TundraGhost 29 августа 2008 18:40:22 т.е. если нужно тебе, скажем, ООП -- вот пара функций, при помощи них можешь писать программы в этой парадигме. нужно тебе вот такой вот метод программирования -- вот еще пара функций, при помощи них можешь писать программы и в этой парадигме. и т.д. androidoed 29 августа 2008 18:46:04 у меня сейчас на томкате, например, крутятся фишки: в списке с определённым именем хранится тело функции, которую можно выполнить. Её можно изменить, изменения проявятся сразу в масштабах всего ряда томкатов. Но! для каждого зарегистрированного пользователя эти функции разные (а имя-то одно), т.е androidoed 29 августа 2008 18:46:05 . вызвал её я - она мне сделает одно, вызвал её дядя Вася, она делает совсем другое, а что именно, не знаю ни я, ни дядя Вася, ибо тело функции зависит от персональных настроек пользователя... хотя, если даны соответствующие полномочия, я могу посмотреть тело СВОЕЙ функии, а имея доступ к СУБД, могу посмотреть тела функции и других пользователей (но это хак).. androidoed 29 августа 2008 18:46:05 . А могу создать функцию, общую для всех, каждый может её посмотреть, скопировать, поменять (прям копилефт в действии), но не может изменить МОЮ функцию... Ай, долго рассказывать, тут дело в том, что так можно в системе настроить свою рабочую среду так, как тебе нужно (юзерский интерфейс с оформлением - это только самая малость) androidoed 29 августа 2008 18:48:02 и всё это - посредством броузера androidoed 29 августа 2008 18:48:22 т.е. без программирования со стороны пользователя androidoed 29 августа 2008 18:49:19 в формочке понаставил крыжиков, выделил что-то из списков выбора, задал цвета, строки... и всё. особо продвинутые в строках могут даже кусочки кода написать androidoed 29 августа 2008 18:50:42 я вот теперь не знаю, на какие формы попадёт определённый пользователь из текущей формы, ибо это тоже динамически задаётся ;) androidoed 29 августа 2008 18:51:29 так что - смерть фиксированным адресам в HTML-атрибуте "action" формы :-D