Следующий комбинатор использует параметры по умолчанию в креативном (некоторые могут сказать оскорбительным) образом и ведет себя примерно так, как в Схеме letrec
*:
* Пожалуйста, исправьте меня, если я ошибаюсь, Я плохо знаю Схему
const bind = f => f();
const main = bind(
(x = 2, y = x * x, z = y * y, total = x + y + z, foo = "foo") => [x, y, z, total, foo]);
console.log(main);
Работает, но bind
не имеет типа. Затем я попытался вручную закодировать указанную выше main
функцию:
const app = x => f => f(x);
const main = app(2) (x =>
app(x * x) (y =>
app(y * y) (z =>
app(x + y + z) (total =>
app("foo") (foo => [x, y, z, total, foo])))));
console.log(main);
Это может работать, но это отвратительно. Как я могу избежать вложения? Я играл с fix
и рекурсией, но понятия не имею, как express замыкания таким образом:
const fix = f => x => f(fix(f)) (x);
const letrec3 = f => fix(rec => acc => x =>
acc.length === 2
? acc.reduce((g, x) => g(x), f) (x)
: rec(acc.concat(x))) ([]);
const main = letrec3(x => y => z => total => foo => [x, y, z, total, foo]) (2) ("2 * 2") ("4 * 4") ("2 + 4 + 16") ("foo");
console.log(main);
Существует ли рекурсивный алгоритм, который эффективно создает замыкания или локальные привязки, так что текущая привязка может зависеть от предыдущих?