Вопрос №8147 от пользователя Alex Weinberg в уроке «Функции как объекты первого класса», курс «JS: Составные данные»

Вопрос №8147 от пользователя Alex Weinberg в уроке «Функции как объекты первого класса», курс «JS: Составные данные»

Я совершенно не понимаю логику тестов( Хотя казалось бы, теория не очень сложная, но тесты ставят в тупик. Пример:

Отметьте константы, содержащие функцию высшего порядка (higher-order function):

В конце концов, случайно накликал решение задачи и не понял ещё больше. Почему это multiB и multiC? Чем они отличаются от multiA? Да и сама multiplication разве не возвращает другую функцию как результат исполнения? Поясните, пожалуйста.

Upd.: нашёл следующий диалог в слаке:

Да, там ошибка. Они тесты меняют постоянно, вот и ошиблись.

Я ради интереса покликал, там еще вопрос:

Может ли функция быть одновременно функцией первого класса и функцией высшего порядка?"

Ответ да - неправильный!

И как же их проходить, кроме как брутфорсом?

Ждать пока починят или другие уроки проходить ¯\_(ツ)_/¯

Кстати, они просто похоже в условии ошиблись и надо отмечать константы которые НЕ содержат фвп, потому что multiB и multiC их как раз не содержат.

Добрый день! Действительно, сейчас идёт интенсивное обновление квизов, иногда возникают неприятные "бяки", за что приносим извинения. Тесты зафиксили и обновили, попробуйте теперь пройти их - в случае чего, можете написать прямо сюда. Спасибо!

Ниже определена функция getIncreasedNumFunction , которая принимает на вход значение множителя и возвращает функцию num => num * multiplier . Возвращаемая функция работает следующим образом: она принимает на вход число num и возвращает произведение этого числа на множитель multiplier .

  • Вызов getIncreasedNumFunction(10)(5) возвращает числовое значение
  • Вызов getIncreasedNumFunction(10)(5) возвращает функцию
  • Функция getIncreasedNumFunction принимает в качестве аргумента другую функцию и по этой причине является функцией высшего порядка
  • На последней строчке кода возникает ошибка TypeError, потому что происходит попытка вызова числового значения как функции, что недопустимо

Правильный ответ противоречит условию. Понятно, что имел в виду автор, но формально, вызов getIncreasedNumFunction возвращает функцию, результат вычисления которой возвращает число.

В целом, остальные тесты уже намного лучше.

Тут уже вы ошибаетесь. В тесте нет ничего про вызов getIncreasedNumFunction. Там речь идет о вызове getIncreasedNumFunction(10)(5).

В общем я снова прошел этот тест. Ошибок не заметил.

Отметьте константы, содержащие функцию высшего порядка (higher-order function):

в число верных почему-то не включен, хотя возвращает функцию.

То есть multiB содержит в себе функцию высшего порядка? Можете написать какую?

Ах, содержит.

Да, текст вопросов иногда составлен в трудном для понимания стиле.

В то же время, multiB есть ссылка (референс) на функцию, которая в замыкании хранит значения двух множителей (a и b), и как результат работы возвращает новую функцию.

Ну а поскольку она возвращает новую функцию, то согласно определению в Вики goo.gl/8MqFwk формально она является функцией высшего порядка.

То есть, константа multiB "содержит" в себе функцию высшего порядка.

которая в замыкании хранит значения двух множителей (a и b)

Вам нужно почитать что-нибудь про каррирование. Здесь нет никакого замыкания.

multiplication(10) возвращает новую функцию уже без a: b => c => 10 * b * c , а multiA(20) возвращает новую функцию уже без b: c => 10 * 20 * c .

В то же время, multiB есть ссылка (референс) на функцию, которая в замыкании хранит значения двух множителей (a и b), и как результат работы возвращает новую функцию.

Ок, давайте посмотрим на результат работы функции, которую содержит multiB :

Какой результат вернул вызов этой функции? Что содержит константа result ?

Вам нужно почитать что-нибудь про каррирование. Здесь нет никакого замыкания.

Замыкание как раз есть и каррирование здесь построено на его основе.

Замыкание здесь есть и каррирование здесь построено на его основе.

Ну тогда я пошел читать про каррирование :) Сорри за дезинформацию.

Разобрался, понял, спасибо.

Действительно, был неправ - multiB возвращает простое призведение.

Кстати, уже не по теме, но в продолжение дискуссии по вопросу

Вам нужно почитать что-нибудь про каррирование. Здесь нет никакого замыкания.

Перечитал, заодно переписал в стиле ES5, без стрелочных функций - https://repl.it/Ij0M/2 - так вроде нагляднее.

Как я понимаю, при любом каррировании значения промежуточных аргументов хранятся именно в замыканиях. Конкретно в данном примере подстановка параметров в произведение a*b*c произойдет в момент вызова multiB(30), а до тех пор промежуточные аргументы хранятся в лексической области видимости промежуточных функций - то есть, в замыканиях.

Ну тогда я пошел читать про каррирование :)

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

Функция multiB в своём теле содержит выражение, состоящее из переменных ( a , b , c ), а не литеральных значений (конкретных чисел). Когда выражение вычисляется, то интерпретатор вычисляет значения этих переменных - значение c находит в теле функции (ибо это локальная переменная (переданный аргумент)), переменные a и b находит в замыкании.

Два раза прочитал эту ветку, но так и не понял, почему верный ответ - это только константы multiplication и multiA . Константа multiB ведь тоже возвращается функцию, разве нет?

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

Ну так multiB функция высшего порядка, разве нет? Она ведь возвращает c => 10 * 20 * c;

Николай, что именно возвращает multiB? В смысле - значение какого типа?

Аааа, точно _ . Теперь понятно, спасибо большое! Стоило самому руками расписать, чтобы понять =)

📎📎📎📎📎📎📎📎📎📎