Вопрос №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? В смысле - значение какого типа?
Аааа, точно _ . Теперь понятно, спасибо большое! Стоило самому руками расписать, чтобы понять =)