Гарри Поттер и методы рационального мышления

Книга доступна бесплатно на hpmor.ru

Книга по мотивам романа Дж. К. Роулинг «Гарри Поттер и философский камень».

Автор — один из создателей сайта lesswrong.com (есть и русская версия), на котором собрана куча материалов про «развитие рациональности человека и преодоление когнитивных искажений». Книга — обзорная и упрощенная версия материалов сайта в художественной обработке для массового читателя.

Автор ну совсем не профессиональный писатель. Однако, в наше время шаблонных высеров для покупательской фокус-группы это даже хорошо. Повествование интересное даже не смотря на очаги скучного графоманства, не особо стройный сюжет и противоречивость персонажей. Хороший, годный самиздат, который по достоинству оценили многие читатели.

Текст насыщен отсылками на книги и исследования из самых разных областей. Они подаются под соусом размышлений, экспериментов и приключений одиннадцатилетнего вундеркинда Гарри Поттера и его друзей. Гарри хочет с помощью магловской науки вывести магию на новый уровень и использовать эти знания во благо человечества.

После смерти своих родителей-волшебников Гарри Поттер попадает в семью ученого. Он с детства много читает, учится у частных преподавателей и страстно увлечен наукой. Когда приходит время, его приглашают в школу чародейства и там его научный подход и рационализм раскрывается в полной мере.

Дети в Хогвартсе занимаются совсем не детской хернёй: воюют, плетут интриги, хотят захватить мир и в то же время учат уроки, любят газировку и ничего детского им не чуждо. Такой дуализм местами доставляет.

— Ага, — сказал отец Гарри, сверкнув глазами, — теперь понятно, почему в третьем классе ты укусил свою учительницу математики.

— Она не знала, что такое логарифм!


— Скажем, ты мог бы достать мне базуку? В смысле, гранатомёт. Уверена, никто не ожидает от девочки, что у неё окажется базука, особенно, если эта девочка излучает ауру чистоты и невинности.

— Слушай, — спокойно сказал Гарри, — вот теперь ты начинаешь меня пугать.

Есть первая категория читателей, которые ссут кипятком от этой книжки и считают ее чуть ли не библией рационалиста.

Есть вторая, которая наслушалась первую, ждёт каких-то откровений, не получает их и расстраивается.

Есть еще третья категория, которая привыкла к хорошей литературе, замечает сумбурный сюжет, противоречивость персонажей и это портит им впечатление.

Как по мне, ХПиМРМ — просто прикольная, развлекательная и познавательная книга. Можно много чего оттуда надергать для дальнейшего разбора, а можно просто получать фан от повествования. Задача книги — в развлекательной манере пробудить исследовательский интерес у читателя и автор с ней вполне справился.

Про книгу узнал на Хекслете, читал epub с телефона. Начал 30.12.2018, закончил 6.03.2019.

Top-notch Magento Frontend Development Experience

Как превратить унылую разработку фронтенда в Magento в супер-престижный топчик и захапать себе в компанию первоклассных специалистов. Немного помечтаем…

С бэкендом новой Мадженты можно работать через GraphQL-прослойку. Разработчики постарались целиком отделить фронтенд, создали опенсорсный коценпт на React-компонентах и сказали, что в этом ключе будет идти дальнейшее развитие. То есть фронтенд мы сможем делать как захотим.

Итак, идея. Нам понадобится два отдела фронтенда. Одни будут писать на ClojureScript, а другие на ReasonML. И то и то будет компилироваться в React-компоненты.

Почему не JS? Потому что нам нужны хардкорные programming junky, у которых борода растет не потому, что это модно, а потому что они тупо не бреются никогда (нет времени, надо читать пейперы, экспериментировать, ездить по конференциям и обкладывать друг друга хуями в Твиттере). А еще они уже выгорели-перевыгорели, успокоились и смотрят на вещи рационально.

Получим два конкурирующих лагеря: в первом — язык с минималистическим синтаксисом и динамической типизацией, во втором — строгая типизация с выводом типов.

Clojure появился больше 10 лет назад и продолжает радовать «старых, уставших программистов». Язык создан, чтобы хостится на Java-машине, использовать ее возможности и библиотеки. Компилируется в байт-код и, при этом, дает возможность работать в рантайме. ClosureScript — компилятор, который перегоняет Closure в JS. Для работы с UI на основе React есть несколько решений.

ReasonML — очередное детище Фейсбука. Его придумал тот же дядька, который придумал React. Кстати, первый прототип Реакта был написан на SML — прародителе Ocaml, F# и, собственно, ReasonML. Реакт с Ризоном дружат, это одна из причин, по которой этот язык создавался. А еще ReasonML можно компилировать в низкоуровневый нативный код.

Почему два отдела? Так мы получим «Русскую модель управления», где две конкурирующие инстанции будут делать одно и то же. Всем придется или въебывать от души или сливаться. Между ними неизбежны дичайшие холивары, грызня, но (я надеюсь) относится друг к другу они будут с уважением и любопытством. Возможны перебежки из одного лагеря в другой, потому что интересно и там и там (ротация разработчиков и перенос идей между командами).

Меньше кода, меньше багов, иммутабельность без костылей и, что самое главное, — удовольствие от работы. Просто даешь задачу и на нее накидываются с остервенением, потому что инструмент к этому располагает (современный, функциональный, продуманный язык программирования). И работают с ним люди, who really care about programming.

P.S. А пока возьмем с полки губозакаточную машинку и будем радоваться предпосылкам, что скоро в Мадженте не нужно будет ебстись с лейаутами, темплейтами и осваивать кучу всего, что очень опосредованно касается разработки UI. Нужно будет ебстись с чем-нибудь другим!

Человеческий фактор

Книга на Озоне

Авторы с семидесятых годов исследуют корпоративную среду: проекты, людей, рабочие процессы. Читают лекции, консультируют. Проводят опросы и «военные маневры» (хакатоны внутри компаний), чтобы узнать уровень и мотивацию сотрудников. За это время у них накопилось огромное количество инсайтов.

В книге четко, прямо, местами со злой иронией объясняется, что социальный фактор в первую очередь определяет успех проекта и компании, а технологическая составляющая, зачастую, не так важна.

Написано простым языком, перевод отличный. Тем не менее, книгу читал долго, шло тяжело. Вспомнил, из-за чего перестал работать фултайм в офисе и стал сторониться больших и долгих проектов.

Мастрид, в первую очередь, для владельцев айти-компаний и менеджеров проектов. Крайне рекомендуется всем, кто работает с людьми и влияет на обстановку в офисе: эйчары, тимлиды и пр.

У разработчиков книга может вызвать экзистенциальный кризис. Возможно, вы еще не задумывались о тех вещах, которые в ней описаны. Хотите экзистенциального прихода — читайте, думайте о жизни и увольняйтесь делайте выводы.

Оригинальное третье издание от 2013-го, русский перевод от 2014-го. Все свежо, все актуально.

В конце цитата из главы про сроки, сверхурочные, трудоголизм и манеру управления, которая это подразумевает:

Возможно, ваш персонал на работе находится под воздействием принципа «работай больше и усерднее», однако дома человек находится во власти совсем иных мыслей. Например, таких: «Жизнь проходит. Нестираное бельё переполняет шкаф, детей некому обнять, супруг(а) начинает смотреть налево. Карусель жизни совершает лишь один оборот, и есть только один шанс добиться успеха. А ты тратишь свою жизнь на Magento…»

И песня Билли Джоэла про Вену из той же главы. Часто ее теперь слушаю:

Просто космос

Книга про постановку целей, планирование, формирование привычек и всякое разное, что помогает делать нужные дела и не делать не нужные.

Автор, Катерина Ленгольд, в 14 поступила в универ, получила 5 высших образований (в том числе в MIT), к 23 годам успела организовать и продать стартап про снимки со спутников.

Все мои достижения — результат упертости и умения ставить четкие цели, нарезать их на маленькие кусочки, планировать шаги для их реализации и находить мотивирующую морковку.

Прелесть книги не в новизне информации (все практики давно известны), а в четкой прикладной системе. Отличное практическое введение в чудесный мир планирования и самоорганизации.

В книге всего 160 страниц, написана простым, понятным языком, без воды и выебонов, что редко для такого рода литературы.

Подход

Долгосрочное планирование не работает. Автор предлагает использовать 9-недельные спринты.

Наше предназначение, если таковое вообще существует, неизбежно меняется в течение жизни по мере того, как мы впитываем новый опыт, знания, впечатления.

В спринте нужно запланировать по три цели в развитии, карьере и личной жизни. Каждую неделю и в конце спринта нужно оценить результаты по каждому направлению.

Слово priority появилось в английском языке в XV веке и не имело формы множественного числа в течение пяти столетий. Приоритет по определению может быть только один.

Есть классная фраза, которая принадлежит Джиму Коллинзу, автору книги «От хорошего к великому»: «Если у вас больше трех приоритетов, то у вас нет приоритетов».

Еженедельно составляется список задач. Каждый день выбираются три важные задачи и ряд второстепенных. Важные надо сделать обязательно, второстепенные — желательно.

Каждый день нужно записать достижения и благодарности. Что успел, что получилось, кто помог, что было хорошего. Такого рода рефлексия успокаивает, настраивает на позитивный лад, дает подзарядку для следующего дня.

Важно следить за привычками. Аккуратно, по-немногу заменять вредные полезными. Про это есть отдельная глава. Некоторые привычки лучше объединить в ритуалы и доводить их до автоматизма, выполнять не думая, чтобы не тратить когнитивную энергию.

Бумага и ручка лучше компьютера или телефона. По методе продается ежедневник. Можно скачать его в PDF, распечатать и начать юзать.

Качественный отдых получается, когда планируешь его заранее. Предвкушение ништяков в конце недели или спринта делает счастливее.

Ну и что?

Попробовал юазть ежедневник — понравилось. Ежедневные рефлексии с ручкой и бумажкой дают ощущение, что все не так уж и бессмысленно в этой жизни.

Завел привычку нюхать мятное масло. Капнуть на руки, растереть, поднести к лицу и вдохнуть несколько раз. Бодрит.

Начал юзать Forest — занятный таймер, а-ля помидорка. Заводишь на нужное время, он блочит приложения/сайты. Не прерываешься — вырастет зеленое дерево. Прервешься — оно засохнет. В итоге получается лес.

Интересное

Valedictorian — суперотличник. Студент, который лучше всех учился и которому дают право произнести прощальную речь на выпускном.

Силу воли можно тренировать. В книге упоминается эксперимент с зефиркой, которых в 1960-х проводили в Стэнфорде. Детей оставляли на 5 минут с лакомством. Если они его не трогали, то им давали еще одну зефрику. Если они съедали зефирку, то не получали ничего.

Через несколько лет исследователи снова встретились с этими детьми, уже повзрослевшими. Те, кто выдержал и получил вторую порцию лучше успевали в учебе и других сферах жизни.

Прикольный доклад об откладывании на потом.

Что еще почитать

Четкие критерии измерения, писал Питер Друкер, помогают нам ставить цели и оценивать, насколько мы к ним продвинулись.

Друкер П. Практика менеджмента. М.: Манн, Иванов и Фербер, 2015.

Когда автор книги «Поток» Михай Чиксентмихайи отправил несколько десятков писем ведущим предпринимателям и руководителям крупных корпораций с приглашением на интервью, многие из них не ответили. Питер Друкер, один из «отцов менеджмента» и бизнес-гениев XX века, написал следующее: «Я надеюсь, вы не сочтете меня самонадеянным или грубым, если я скажу, что один из секретов производительности — очень большая мусорная корзина, в которую отправляются все приглашения, подобные вашему».

Чиксентмихайи М. «Поток».

«Если на тело не действуют силы или их действие скомпенсировано, то данное тело находится в состоянии покоя или равномерного прямолинейного движения. Свойство тел сохранять свою скорость при отсутствии действия на него других тел называется инерцией».

Ньютон И. Математические начала натуральной философии. М.: Наука, 1989

«Всё несчастье людей происходит от того, что они не умеют спокойно сидеть в своей комнате.»

Паскаль Б. Мысли. М.: Азбука, 2017.

О шрифте

Эрик Шпикерманн — известный немецкий типограф. Впервые узнал о нем в 2005-м из книги Дмитрия Кирсанова «Веб-дизайн». Помню, что очень понравился его шрифт Meta — клёвый, современный гуманистический гротеск. Сделан как противоположность «скучной и пресной» Гельветике.

Страница из книги Дмитрия Кирсанова «Веб-дизайн».
Сайт студии Эрика Шпикермана. Где-то 1999 год.

Я тогда только начал заниматься дизайном и мне хотелось пихать его шрифты вообще везде. Кириллической версии Меты не было, зато по рукам ходил другой шрифт Эрика — Officina. Вот его и пихал.

Билайн, когда делал свой полосатый ребрендинг, выбрал Официну своим основным шрифтом.

Страница из брендбука Билайна, 2005 год.

В книге автор рассказывает, с какой стороны подступиться к типографике и приводит характерные примеры набора: большие тексты, объявления, навигация, тексты на разных экранах, деловая переписка и пр.

Как выбрать интерлиньяж, трекинг, размер, формат, гарнитуру — все это дается на начальном уровне.

На левой стороне каждого разворота есть красивая картинка: фотка или пример применения шрифтов.

Пример разворота с сайта издательства.

Книга может быть хорошим старом для тех, кто хочет начать свое знакомство с типографикой. Неплохое введение, хотя и довольно поверхностное. Зато какие картинки!

Первая страница главы «Что такое шрифт»

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

Узнал про шрифт Chartwell для создания графиков. Пишешь что-то типа 20+30+50, выбираешь Чартвел и цифры превращаются в диаграмму. Формат OpenType позволяет такое делать.

Первое издание книги было аж в 1993 году. Последнее оригинальное издание датируется 2014-м. На русском издано в 2017-м.

Полный стэк на одном языке или изоморфизм Рича Хикки

Заметки по докладу Николая Рыжикова с FPConf2017:

Заметки больше по философской части доклада. Практическая часть, где автор показывал, как вообще все в проекте делать на Clojure, была не так интересна.

Автор интересно рассуждает, почему в современном мире огромный пласт задач удобнее решать с помощью динамичных языков.

Информация

— Что такое информация?
— Информация — данные, которые позволяют принимать решения.
— Так данные же и есть информация.
— Значит, информация — послание, имеющее смысл.
— Или, информация — то, что уменьшает неопределенность.

Вернадский когда-то говорил о Ноосфере (то, что создано человеком, его разумной деятельностью), сейчас мы формируем Инфосферу и ей заведуют «духи, живущие внутри компьютера».

Мы пишем динамические, связанные между собой системы, которые используют нелогичные, неструктурированные данные из внешнего, неопределенного мира.

«JSON сейчас — кровь информации».

Закрытые и открытые системы

Open-world assumption — то, что нам неизвестно, считается неопределенным:

Дано:
— Вася любит кошек!
— Вера любит собак!
— Вера любит кошек!

Запрос:
— А Вася любит собак?

Ответ открытой системы:
— Хз, он не сказал.

Closed-world assumption — то, что нам неизвестно, считается заведомо ложным, некорректным.

Дано:
— Вася любит кошек!
— Вера любит собак!
— Вера любит кошек!

Запрос:
— А Вася любит собак?

Ответ закрытой системы:
— Ошибка!

Пример. Пришли данные в JSON с неизвестными полями. Открытая система эти поля игнорирует, закрытая считает JSON некорректным и выдает ошибку.

Система типов — closed-world assumption. Это математическая модель, которая едва ли может смоделировать тот информационный хаос, в котором она работает.

Функциональное программирование и вывод типов

Функциональное программирование (ФП) — очень простая концепция: чистые функции, функции высшего порядка и все. Где есть типы, там уже другое. С помощью типизации мы пытаемся натянуть внешний мир на математику, а он плохо натягивается.

Автор призывает не смешивать ФП и программирование с помощью типов. ФП — простой инструмент, которые многие могут быстро освоить и применять. А к программированию на типах всегда можно вернуться, когда это понадобиться или когда будет интересно.

Когда мы пишем систему (формируем новый атом в Инфосфере), нам не нужно сразу доказывать, что она правильная. Доказательство корректности системы — вторично.

Бережливое производство — каждый шаг должен добавлять ценность.

Написали Фейсбук на старом PHP и он работает. Корректность — не основное свойство: написали, как написали. Главное, что эта штука несет ценность (создателю, миру). А раз так, то зачем преждевременно уделять так много внимания доказательству корректности?

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

При работе на проектах постоянно приходят запросы на изменения, противоречащие тому, что было сделано ранее. В системе типов приходится менять модель, скелет системы.

Clojure

В Clojure принято: Prefer function over macros, prefer data over function.

Библиотеки на Clojure часто весят сильно меньше, чем аналогичные решения на других языках. Потому что в Кложе просто нет инструментов для переизобретения мира. Это сознательно ограниченный язык, там один подход ко всему.

Рич Хикки (создатель Clojure) прочитал Purely Functional Data Structures, потом узнал про Hash Array Mapped Tree, что-то там совместил и получил эффективные структуры данных. Этого минимума хватает и таким макаром можно писать в любом языке.

Автор шутит: «ООП изобрели, потому что не было хэш-мапов».

Генеративные тесты. Хз, что это, но звучит по-умному.

Итого

Clojure — намеренно ограниченный язык, которые не дает никаких средств для моделирования того, что смоделировать в принципе невозможно. На тебе функции, вектор, хеш-мэп и узбагойся.

В программах на Clojure данные первичны, функции помогают и еще есть макросы, когда совсем никак без них нельзя. Есть ограниченный набор структур данных, клевых, быстрых, современных. Простой, но мощный язык, на котором можно писать вообще все.

Дополнения

Доклад Николая здорово дополняет доклад самого Рича Хикки «Effective Programs – 10 Years of Clojure»:

Рич Хикки много лет программировал реал-тайм системы на C++ для радио. Потом начал делать это на Common Lisp и перегонять его в C++. А потом ушел на 2 года в отпуск и написал Clojure.

Если интересна Кложа, недавно вышла книга на русском App From Scratch, в которой в процессе создания веб-проекта рассказывается о языке и принципах хорошей архитектуры.

Анонимные и лямбда функции

Наткнулся на заметку, в которой Эрик Эллиотт рассуждает, когда анонимные функции в JS являются лямбдами, а когда нет. Стало интересно, стал разбираться. Тема с выбором терминов оказалась весьма неоднозначной, в итоге получился большой пост.

Анонимная функция

Анонимная функция — это функция, которой не присваивается идентификатор. Во многих языках такую функцию можно:

  • передавать как аргумент в другую функцию,
  • сохранять в переменную,
  • вызывать на месте.

Передача аргументом удобна в обработчиках, если функция небольшая и используется один раз:

[-1, 0, -3, 2, 3].filter(n => n > 0);
// [2, 3], вернулся массив с элементами больше нуля

Функция-стрелка в JS всегда анонимна, ее как раз для этого и придумали.

Присваивание анонимной функции часто встречается в обработке событий:

window.onload = function() {
  alert('Page has been loaded.');
}

Вызов функции на месте в JS обычно используют для ограничения области видимости:

(function () {
  // Переменные внутри функции не видны сраружи
  const inner = "You can't see me from outside!";
})();
console.info(inner); // inner is not defined

С появлением модулей и классов в JS этот прием уже не так актуален и это хорошо.

Лямбда-функция

Современные языки программирования часто заимствуют приемы работы с функциями из лямбда-исчисления — математического аппарата, который в 1930-е разработал Алонзо Черч для того, чтобы разобраться с понятием вычислимости.

Определение

Лямбда-функция — упрощенная модель математической функции. Упрощенная, потому что она даже имени не имеет и может принимать только один аргумент. Зато этот аргумент может быть такой же функцией и, используя вложенность, мы можем строить сколь угодно сложные выражения.

Запись λx.M означает, что функция принимает аргумент x (пишется после лямбды, перед точкой) и использует его в выражении M. Эту же запись можно представить так: x -> M (передаем икс куда-то, где с ним что-то будем делать).

Например, в выражении λx.x*3 аргументом является икс, который в теле функции умножается на три. Это же выражение можно записать так: x => x * 3 (привет функции-стрелки из ES2015).

Почему лямбда?

Символ особого значения не имеет, но всегда интересно узнать подноготную. Черчу нужно было как-то обозначить абстрактную сущность, которая принимает параметр. До Черча похожие исследования уже проводились и в них использовался символ . Исследования Черча отличались и он, чтоб не путать понятия, стал писать крышку сбоку, а не сверху: ∧x. Потом для удобства печати клин заменили на λ.

By the way, why did Church choose the notation “λ”? In [Church, 1964, §2] he stated clearly that it came from the notation “x̂” used for class-abstraction by Whitehead and Russell, by first modifying “x̂” to “∧x” to distinguish function-abstraction from class-abstraction, and then changing “∧” to “λ” for ease of printing. This origin was also reported in [Rosser, 1984, p.338 ]. On the other hand, in his later years Church told two enquirers that the choice was more accidental: a symbol was needed and “λ” just happened to be chosen.

…Church was not the first to introduce an explicit notation for function-abstraction. But he was the first to state explicit formal conversion rules for the notation, and to analyse their consequences in depth.History of Lambda-calculus and Combinatory Logic

Связанные и свободные переменные

Переменная, которая передается в функцию и используется в ее теле называется связанной. x в примере выше — связанная переменная. А, например, z в выражении λx.x+zсвободная, потому что берется откуда-то из внешней среды (привет замыкания).

Основная задача лямбда-выражения вида λx.Mобозначать связывание переменных.

Характеристики λ-функции

Если грубо и по-быстрому охарактеризовать лямбда-функцию, получится такой набор особенностей:

  • не имеет имени;
  • может принимать только один аргумент;
  • нужна для связывания переменных;
  • может передаваться как аргумент в другую функцию или возвращаться из функции в качестве результата вычисления;
  • не может влиять на внешний мир (без сайд-эффектов).

Похоже на анонимные функции, но имеются весьма существенные ограничения.

Применение в программировании

На основе лямбда-исчисления придумали функциональные языки: Lisp, Haskell, Miranda, ML и пр. Программа на таком языке — это выражение, составленное из других выражений, вычисляя которое мы решаем свою задачу (реализуем алгоритм). Как 2+3 возвращает 5, так и программа на функциональном языке должна в итоге что-то вернуть.

Однако, не все так просто. В реальном мире программа помимо результата обычно что-то выводит на экран, что-то запрашивает у пользователя, то есть производит сайд-эффекты. Это не характерно математическому аппарату, и тру лямбда-функции сайд-эффектов производить не могут.

Разные языки программирования решают разные задачи. Например, Хаскель и Миранда придуманы для математиков, поэтому они должны как можно четче соответствовать принципам лямбда-исчисления. А вот Питону вообще пофиг на лямбда-исчисление, потому что это язык для обычных людей, которым надо решать свои повседневные задачи. То же самое касается и JS.

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

В Лиспе и Питоне анонимные функции обозначаются ключевым словом lambda. Но это вовсе не значит, что эти функции полностью соответствуют принципам лямбда-исчисления: аргументов может быть много или вообще не быть, никто не мешает создавать сайд-эффекты.

Лисп:

((lambda (msg) (print msg)) "hello")

Питон:

(lambda msg: print(msg))("hello")

JavaScript:

((msg) => console.log(msg))("hello");

Задачи повседневности лучше всего решают императивные языки, в которых сайд-эффекты вообще везде (любой цикл с i++). Сама архитектура ЭВМ к этому располагает. Ништяки из функциональной парадигмы в этих языках — просто инструменты в арсенале разработчика, который, зачастую, не слышал ничего о лямбда-исчислении и прочих высоких материях.

В функциональных языках сайд-эффекты — дурной тон, но от них никуда не деться. Надо же как-то забирать у пользователя данные и выводить результат вычислений на экран.

Анонимная функция vs лямбда-функция

В программировании часто анонимные функции называют лямбдами. Хоть формально анонимные функции не соответствуют всем параметрам лямбда-исчисления, называть их лямбдами нормально. Мы это видели в синтаксисе Питона и Лиспа. Вот еще, например, официальное руководство C#.

После всего вышеописанного та заметка, с которой все началось, уже не кажется такой интересной. Все зависит от языка. Хотим — называем анонимные функции лямбдами, не хотим — не называем. Но можно принять некоторые допущения и продолжить :)

Автор говорит, что Lambda means function used as data. Примем это утверждение. Будем считать, что в JS функция, которая приходит параметром, возвращается из функции или присваивается в переменную является лямбдой. Про сайд-эффекты и количество параметров не паримся.

Противоречие первое: функция в IIFE не рассматривается как данные

Автор говорит, что вызываемая на месте функция (IIFE) — не данные и поэтому не лямбда. Мы, мол, эту функцию сразу же выполняем и забываем о ней.

Все так, IIFE — не данные и не лямбда… и не функция. Это выражение, в которое мы передаем анонимную функцию, которая как раз является данными.

Пример:

(function (msg) {
  console.log(msg);
})('foo');

Все дело в скобках. Функция в IIFE — только часть кода. За ее вызов отвечает выражение, в которое она передается. В данном случае это скобки, но можно и по-другому:

!function (msg) {
  console.log(msg);
}('foo');

+function (msg) {
  console.log(msg);
}('foo');

true && function (msg) {
  console.log(msg);
}('foo');

// ...

Мы уже видели, что в Питоне и Лиспе анонимные функции создаются с ключевым словом lambda. В этих языках так же можно сделать IIFE.

Питон:

(lambda: 'hello from IIFE')()

Лисп:

((lambda () "hello from IIFE"))

В этих примерах прям буквами написано: функция в IIFE — лямбда.

Противоречие второе: именованное функциональное выражение является лямбдой

Пример, где функция не анонимная, но ведет себя как лямбда:

const sumOf = function fn (accumulator) {
  // Рекурсивно суммируем числа от 1 до accumulator
  return (accumulator === 0) ? accumulator
                             : accumulator + fn(accumulator - 1);
};
console.log(sumOf(10)); // 55

Тут функция fn — именованная (не анонимная), но ведет себя как лямбда (передается в качестве аргумента). Получается такая лямбда на стероидах, благодаря имени мы можем рекурсивно ее вызывать.

Но раз эта функция не анонимная, то мы уже не можем считать ее лямбдой, потому что у лямбда-функции не может быть имени :) Опять вздрыжне эффект.

Итоги подведем

Лямбда-исчисление — математический аппарат. Программирование — прикладной инструмент. Не стоит сильно париться по поводу соответствия терминологий, хотя теоретическую базу прокачать всегда хорошо.

В JS/Python/OCaml/… мы имеем смесь парадигм. Любой современный язык в той или иной степени поддерживает функциональное, объектно-ориентированное, структурное программирование и реально сложно находить правильные слова среди научных работ, повлиявших на язык.

Если хочется четких формулировок, стоит использовать общепринятые определения из конкретной реализации языка. В JS, например, вместо “лямбда” можно говорить “анонимная функция”, “функциональное выражение” (function expression), “именованное функциональное выражение” (named function expression). Хотя лямбда тоже сойдет, но может быть не всем понятно и некоторые, типа Эрика, могут придраться к частностям.

Возможно, в Хаскеле анонимную функцию можно называть лямбдой без всяких оговорок. Хаскель не даст ее написать без аргументов, в нем нельзя откуда попало создать сайд-эффект, а несколько аргументов, передаваемых в лямбду, обрабатываются через частичное применение (как-бы преобразуются в несколько лямбд, передавая результат выполнения из одной в другую). Язык придумали для тех, кто в разбирается в математике и лямбда-исчислении, поэтому ноблес оближ.

Материалы