Как реализовать letre c в Javascript? - PullRequest
1 голос
/ 01 февраля 2020

Следующий комбинатор использует параметры по умолчанию в креативном (некоторые могут сказать оскорбительным) образом и ведет себя примерно так, как в Схеме 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);

Существует ли рекурсивный алгоритм, который эффективно создает замыкания или локальные привязки, так что текущая привязка может зависеть от предыдущих?

...