Суть задачи в следующем. Я хочу создать вариадическую функцию создания списка/массива:
list(1)(2)(3)(4)(5)() === [1, 2, 3, 4, 5]
Но для простоты рассуждений давайте возьмём вариадическую функцию сложения (просто, чтобы не думать пока об атомарной операции конструирования списка из головы и хвоста):
sum(1)(2)(3)(4)(5)() === 1 + 2 + 3 + 4 + 5 === 15
Вообще, решение для Haskell я нашёл (
stackoverflow.com/questions/3467279/how-to-create-...):
class SumRes r where
sumOf :: Integer -> r
instance SumRes Integer where
sumOf = id
instance (Integral a, SumRes r) => SumRes (a -> r) where
sumOf x = sumOf . (x +) . toInteger
sumOf 1 4 7 10 2 5 8 22 == 59
Но оно использует классы типов. Мне же нужны простые лямбда-функции.
Классы типов нужны в Haskell, так как это статически строго типизированный язык. Предположим же, что у нас язык динамический - JavaScript. Следовательно, по идее, реализовать это должно быть возможно без классов типов (точнее симулировать их работу через условия и проверку типов аргументов). Но я, к сожалению, никак не придумаю, как же это сделать.
Основные ограничения:
- чистота функции - никаких ни внешних, ни внутренних переменных-аккумуляторов быть не должно, важно решение именно в терминах чистых лямбда-функций, т. е. без наличия хранимого состояния;
- арность функции (и всех, ей возвращаемых) должна быть 1 (т. е. они должны принимать только 1 аргумент).
Фактически, я хочу преобразовать вышеприведённый код на Haskell в код на JavaScript с учётом ограничений.
Возможно, я не до конца понимаю, что такое классы типов, но вроде как в данном случае они делают перегрузку функции по типу её результата! Такое в других языках не возможно (хотя можно симулировать чем-то ещё).
Помогите, пожалуйста.