Je answered a question yesterday et il a obtenu mon esprit à penser à un intéressant (pour moi) Casse-têteComment mettre en œuvre f (g) == g (f)
Avec la restriction de l'utilisation lambdas, des chiffres et +
seulement (pas if
, ?:
, ou d'autres caractéristiques linguistiques), l'objectif est de mettre en œuvre certaines f
et certains g
tels que
// contract
f(x) => f'
g(y) => g'
f'(g') == g'(f')
// or more simply:
m(n) == n(m)
Voici ce que je suis venu avec à ce jour - ce code est en J avascript dans le but d'être en mesure de démontrer le code dans le navigateur mais les réponses dans une langue quelconque fonctionnelle sont acceptables (raquette, clojure, ocaml, lambda calc, etc)
// f
const f = x => k =>
k(y => y + x)
// g
const g = y => k =>
k(x => x + y)
// make instance of each
const a = f(1)
const b = g(2)
console.log(a(b))
// x => x + y1
// should be 3
console.log(b(a))
// y => y + x2
// should be 3
J'ai été en mesure de fixer un la moitié de la relation, mais l'autre côté reste brisé en raison de f
et g
étant maintenant asymétrique
// f
const f = x => k =>
k(y => y(x))
// g
const g = y => k =>
k(x => x + y)
// make instance of each
const a = f(1)
const b = g(2)
console.log(a(b))
// 3
// should be 3 (OK)
console.log(b(a))
// y => y + x2
// should be 3
Je sais pourquoi cela ne fonctionne pas, mais je vais avoir du mal à essayer de le réparer. Plus important encore, si ce n'est pas possible, j'aimerais savoir pourquoi.
Si vous venez avec une solution qui brise les restrictions, je suis toujours intéressé à le voir^_^
Vous pouvez le résoudre en créant quelque chose comme 'mayBe monad'. Vous pouvez utiliser une matrice de quelque chose comme ça http://mathworld.wolfram.com/BooleanFunction.html –
Si vous considérez que les arguments par défaut font partie de * lambdas *, au lieu de * "other language features" *, vous pouvez faire: ' const f = x => (fn =() => 0) => x + fn(); ';) – user3297291