TECH · 09 мая 2018, 12:30 · Отдел информации dev.by
Как объяснить функциональное программирование 6-летнему ребёнку?

Профессор информатики Брент Йорги в всоём блоге рассказал о том, как смог шестилетнему сыну доступно объяснить университетский материал. Предлагаем перевод его колонки.

Иллюстрация: IT Pro

Вчера ко мне подошёл мой шестилетний сын и спросил:

— А что ты читаешь?

Читал я на тот момент одну из глав докторской диссертации Джениса Воигтлендера. Даже не зная, с чего начать, я решил ответить прямо:

— Я читаю очень длинную сказку о свободных теоремах.

Но ему этого было недостаточно:

— А что такое свободные теоремы?

Иллюстрация: Wikia

Так как перед педагогическими задачками я никогда не робел, то, немного поразмыслив, начал:

— Ты знаешь, что такое функция? (Он не знал.) Функция — это как машина, в которую ты помещаешь что-то с одной стороны, а с другой выходит что-то новое. Например, ты можешь ввести число, а выйдет из неё число, которое на один больше. То есть если ты введёшь 3, то выйдет 4, а если введёшь 6 — выйдет 7.

Я видел, что он действительно всё понимает, и продолжал:

— Тип такой функции показывает, какие именно вещи нужно вводить и какие мы получим на выходе. Можно вводить число и на выходе получить число. Или вводить список чисел и получать список чисел.

Он живо подхватил:

— Или, может, можно вводить слова?

— Точно! Можно вводить слова и получать тоже слова. Существуют даже функции, в которые можно вводить другие функции и на выходе получать тоже функции!

Сына идея помещать функции в функции привела в восторг. Я подытожил:

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

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

— Послушай, я придумал занятную игру. Она называется «игра в функции». Я загадаю функцию. Ты будешь говорить мне, что мы будем в неё вводить, а я буду говорить, что получается на выходе. А потом ты будешь отгадывать, что делает эта функция.

Игра ему сразу понравилась, и настолько сильно, что играть в неё он готов без остановки: мы играли, пока вчера ехали в гости, сегодня утром пока я принимал душ. Вот что ему уже удалось угадать:

  • x. x + 1
  • x. x – 3
  • x. 10x
  • x. 2x
  • x. 6
  • x (слово). слово во множественном числе.
  • x. 10 [x/10]

Я попробовал x. –(x + 2) и x. –(x + 10), но для него это было сложновато. Я заметил, что в некоторых случаях он внутренне понимал, что делает функция, но не мог выразить это словами (так было, например, с функцией x. 10 [x/10]). Поэтому мы немного изменили правила: когда отгадывающий думал, что знает, что делает функция, мы менялись ролями. Загадывающий функцию теперь придумывал вводные, а разгадывающий должен был подсчитать правильный ответ с этой функцией.

На удивление трудной для него оказалась функция x. 6 (хотя в итоге он с ней всё-таки справился). Думаю, он просто зациклился на том, что функция обязательно должна давать число, отличающееся от вводимого, и поэтому безуспешно пытался найти такую, которая при любых условиях на выходе даёт 6. Его просто смутило, что машине может быть всё равно, какие вводные она получила. (Любопытно, что многих студентов моего курса по функциональному программированию тоже часто сбивали с толку константные функции, когда мы проходили лямбда-исчисление. Им казалось, что вводные обязательно должны меняться, и приходили в замешательство от того, что в теле функции вообще отсутствует связанная переменная).

Несколько раз отгадав мои функции, он захотел придумывать их мне сам (как я и ожидал). Иногда они действительно были здоровские, а иногда немного бессмысленными (обычно потому, что он на ходу изменял их, но, конечно же, признавать ни в какую не хотел). И когда он наконец понял функции x. –(x + 2) и x. –(x + 10), то придумал свою, которая была похожа на

Формула: Брент Йорги

Думаю, на это его вдохновило занятие в садике, на котором они изучали пары цифр, которые в сумме дают 10. Это точно один из моих лучших дней с сыном.

Источник: dev.by
Нашли в тексте ошибку — выделите её и нажмите Ctrl+Enter.
Новые комментарии
Сама идея писать очередную CRM без идеи и инвестиций вгоняет меня в уныние, девочка пытается изобрести велосипед, который был изобретен еще 20 лет назад. Ничего не имею против перла, когда я пришел в веб в 2001 это был вполне современный язык, но технологии меняются, я попробовал много нового и скажу откровенно - перл устарел. Непонятно откуда такое презрение к "галерам", ведь это отличная возможность научиться работать и освоить технологии, в том числе и кодом заказчиков. Ну а если ты в своем болоте гниешь 20 лет, то естественно что и сайты у тебя будут в стиле 90ых. Бред про SEO и Ajax даже комментировать не хочется... учитывая тот факт, что ajax'у тоже не меньше 20 лет. p.s. Ну и на спектруме приходилось программировать, не только на бейсике, но и на асме и работы были вполне серьезные, проекты компилировались по 10 минут. но ведь это не означает что надо было стоять на месте и развиваться только в этом направлении
Alexandr_Voznyak
23.05.2018 в 00:53
«Никогда не вкалывала на галерах». Разработчица пишет на «реликтовом» Perl и 25 лет работает в семейном бизнесе
Мода тут ни при чём, просто когда-то перл был крутым инструментом - не было всяких пхп, а перл был высокоуровневым языком, с кучей библиотек на cpan, готовые либы для веба и так далее, можно было мириться с его дефектами, тем более, что переходили на него сишники, которым не привыкать. А в какой-то момент нормально спроектированные языки вроде питона догнали и значительно перегнали, в итоге перл лишился этих преимуществ, а новых не приобрёл. Я в какой-то момент понял, что просто не могу дальше его использовать, когда есть такие языки как питон. Не могу себя пересилить, ибо нет ответа на вопрос зачем использовать уродливый язык, зачем делать вот так if (any {$_ == $elem} @arr) { когда можно делать так if elem in arr: ? Это частный пример, но таких примеров тьма, не говоря уже о всяких use strict и другой магии которую нужно знать, чтобы было как в нормальных языках по умолчанию, когда-то даже заметку писал - https://habr.com/post/327408/.
worldmind
22.05.2018 в 23:46
«Никогда не вкалывала на галерах». Разработчица пишет на «реликтовом» Perl и 25 лет работает в семейном бизнесе

Обсуждение

Picture_432?1356409809
+4

Я эту игру попробовал на своем девятилетнем. Прекрасно работает! Очень интересно. Он тоже потом придумывал функции с ветвлением, или функцию которая брала последнюю букву в слове и добавляла такую же в начало слова.

Ad496bc5c920a472d4a15cbb57aacfa2?1525938726
Fiodor Tretyakov
– Lead Developer в AutoEntry

Круто! И как теперь у него успехи в программировании?

Picture_432?1356409809
+3

Я вчера это попробовал :)

Missing

изучаю хаскель, эта статья мне немного помогла переосмыслить что я знал о ФП

Missing-male
amok
– Team lead в ISsoft

+1

Он функции объяснил, а не функциональное программирование...

Missing-male
+2

>> Это точно один из моих лучших дней с сыном.

да, это был true ИТ-шник... бедный малыш... но родителей не выбирают :)

425430dd6319f7df5899a4626125ae5c?1427577634
+1

моя любимая функция это x. 0

угадаете, что она делает?

Миша, у тебя какая?


Авторизуйтесь, чтобы оставлять комментарии

Использование материалов, размещенных на сайте, разрешается при условии прямой гиперссылки на dev.by. Ссылка должна быть размещена в подзаголовке или в первом абзаце публикации.
datahata — хостинг в Беларуси