You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Для чего мы обычно создаём функцию с частичным применением?
65
+
Для чего мы обычно создаём функцию частичного применения?
66
66
67
67
Польза от этого в том, что возможно создать независимую функцию с понятным названием (`double`, `triple`). Мы можем использовать её и не передавать каждый раз первый аргумент, т.к. он зафиксирован с помощью `bind`.
68
68
69
-
В других случаях частичное применение полезно, когда у нас есть очень общая функция и для удобства мы хотим создать её частный случай.
69
+
В других случаях частичное применение полезно, когда у нас есть очень общая функция и для удобства мы хотим создать её частный вариант.
70
70
71
-
Например, у нас есть функция `send(from, to, text)`. Потом внутри объекта `user` мы можем захотеть использовать её частный случай: `sendTo(to, text)`, который отправляет текст от имени текущего пользователя.
71
+
Например, у нас есть функция `send(from, to, text)`. Потом внутри объекта `user` мы можем захотеть использовать её частный вариант: `sendTo(to, text)`, который отправляет текст от имени текущего пользователя.
72
72
73
73
## Частичное применение без контекста
74
74
75
75
Что если мы хотим зафиксировать некоторые аргументы, но не привязывать `this`?
76
76
77
77
Встроенный `bind` не позволяет этого. Мы не можем просто опустить контекст и перейти к аргументам.
78
78
79
-
К счастью, это несложно, создать свою функцию частичного применения, которая привязывает только аргументы.
79
+
К счастью, несложно создать функцию частичного применения, которая привязывает только аргументы.
80
80
81
81
Вот так:
82
82
@@ -97,7 +97,7 @@ let user = {
97
97
}
98
98
};
99
99
100
-
// добавляем метод с частичным применением, который говорит что-нибудь в настоящее время за счёт фиксирования первого аргумента
100
+
// добавляем частичный метод который говорит что-нибудь в настоящее время за счёт фиксирования первого аргумента
Каррирование не вызывает функцию. Оно просто трансформирует её.
124
124
125
-
Давайте создадим вспомогательную функцию `curry(f)`, которая выполняет каррирование функции `f` с двумя аргументами. Другими словами, `curry(f)` для функции с двумя аргументами `f(a, b)` трансформирует её в `f(a)(b)`.
125
+
Давайте создадим вспомогательную функцию `curry(f)`, которая выполняет каррирование бинарной функции `f`. Другими словами, `curry(f)` для бинарной функции f(a, b)` трансформирует её в `f(a)(b)`.
- Результат `curry(func)` -- обёртка `function(a)`.
151
151
- Когда она вызывается как `sum(1)`, аргумент сохраняется в лексическом окружении и возвращается новая обёртка `function(b)`.
152
-
- When it is called like `sum(1)`, the argument is saved in the Lexical Environment, and a new wrapper is returned `function(b)`.
153
-
- После чего `sum(1)(2)`, наконец, вызывает `function(b)`, предоставляя `2` и передаёт вызов к оригинальной функции `sum`, принимающей несколько аргументов.
152
+
- После чего `sum(1)(2)`, наконец, вызывает `function(b)`, предоставляя `2` и передаёт вызов к оригинальной мультиарной функции `sum`.
154
153
155
154
Более продвинутая реализация каррирования, как [_.curry](https://lodash.com/docs#curry) из библиотеки lodash, делает нечто более сложное. Она возвращает обёртку, которая позволяет выполнить функцию, если переданы все аргументы, в противном же случае -- возвращает функцию частичного применения.
0 commit comments