J'essayais d'implémenter le combinateur Y en Javascript.En Javascript, pourquoi ne puis-je pas remplacer x => f (f) (x) par f (f)?
j'ai réussi à mettre en œuvre les éléments suivants:
const y0 = gen => (f => f(f))(f => gen(x => f(f)(x)));
const factorial0 = y0(fact => n => n<=2 ? n : n * fact(n-1));
console.log(factorial0(5));
// 120
Il fonctionne bien.
Ensuite, je considérais l'expression x => f(f)(x)
. Je comprends qu'une expression x => g(x)
est équivalente à g
. L'application de y
à x => g(x)
est évaluée à g(y)
, tandis que l'application y
à g
est également évaluée à g(y)
. J'ai donc remplacé x => f(f)(x)
par f(f)
.
const y = gen => (f => f(f))(f => gen(f(f)));
const factorial = y(fact => n => n<=2 ? n : n * fact(n-1));
console.log(factorial(5));
// RangeError: Maximum call stack size exceeded
Mais cette version se bloque avec un débordement de pile.
Alors quelle est la différence entre x => f(f)(x)
et f(f)
de sorte que l'un fonctionne et l'autre se bloque.
Parce que l'évaluation stricte. – Bergi
@Bergi Trois mots - J'appelle cela une explication paresseuse: D – ftor