Как проверить функцию на карирование?
Как проверить являеться функция карированой или нет
я хочу вызывать ее либо так
sum(1, 2) // результат 3
либо так
sum(1, 2)(3) // резултьтат 6
Проблема в том что я понимаю как сделать это при карировваном варианте, но при этом я не понимаю как вызывать ее при варианте sum(1, 2) так как она возвращает [Function].
function sum(...rest1) {
return function(...rest2) {
let counter = 0
Array.prototype.concat(rest1, rest2).forEach((n) => {
counter += n
})
return counter
}
}
console.log(sum(1, 2)(3))
Как организовать проверку внутри тела функции на то являеться она карированой или нет, когда колличество аргументов неизвестно?
Как можно сделать так что бы данная функция работала если ее вызвать как sum(1, 2) и sum(1, 2)(3)?
Ответы (2 шт):
Вы никогда не можете знать, как будет применяться ваша функция в дальнейшем. К примеру, на первой строке вы можете сделать так:
let a = sum(1,2);
Проблема в том, что через тысячу строк это может быть вызвано кем-то как функция a(1,2), так и в тоже самое время использоваться напрямую как значение c = a + 10. Следовательно вам нужно знать наперед, как будет использоваться функция в будущем. Либо ей нужно быть одновременно и функцией и числом, что в принципе невозможно.
Можно конечно ломать язык и изощрятся подобным образом, но никогда и ни при каких обстоятельствах не пишите подобный код в реальных проектах. Как минимум, это может иметь непредсказуемые последствия в других примерах кода.
function sum(...rest1) {
let func = function(...rest2) {
let counter = 0
Array.prototype.concat(rest1, rest2).forEach((n) => {
counter += n
})
return counter
}
func.toString = func.valueOf = function() { return rest1.reduce((a, b) => a + b, 0) }
return func;
}
console.log(sum(1,2))
console.log(sum(1,2)(3,4))
В javascript такой фокус вряд ли пройдет.
Самое простое -- сделать две функции с разными именами.
Или делать sum(a)(b)(c)(), sum(a)(b)().
В scala такое сделать можно, т. к. типизация статическая, но даже там не рекоммендуют.
В javascript фокус проходит с valueOf (век живи ...)