J'essaie d'utiliser une approche fonctionnelle pour résoudre un problème particulier dans le cadre d'un exercice d'apprentissage de Ramda.js.Comment utiliser correctement Ramda/JS pour composer des fonctions
J'ai donc ce test:
it.only("map short name to long name POINTFREE",() => {
let options = [ { long: "perky", short: "p" }, { long: "turky", short: "t" } ];
let lookupByShortName = R.find(R.propEq("short", "t"));
let result = lookupByShortName(options);
expect(result).to.have.property("long", "turky");
});
"options" est utilisé comme une séquence de recherche. J'ai besoin de convertir une série de chaînes spécifiées comme un seul char, d'être le plus long nom équivalent en se référant à la séquence d'options. Donc le caractère "t" devrait être converti en "turky" comme défini dans les options.
Cependant, ce n'est pas tout à fait structuré de la façon dont j'ai besoin d'être utile. La fonction 'lookupByShortName' n'est pas générale, elle est codée en dur avec la valeur "t". Ce que je veux c'est omettre le paramètre "t", de sorte que lorsque vous appelez lookupByShortName, car il devrait être curry (par R.find), il devrait retourner une fonction qui nécessite l'argument manquant. Donc, si je fais cela, le test échoue:
let lookupByShortName = R.find(R.propEq("short"));
donc ici, lookupByShortName doit devenir une fonction qui nécessite un seul paramètre manquant, donc théoriquement, je pense que je devrais être en mesure d'invoquer cette fonction comme suit:
lookupByShortName("t")
ou plus précisément (le "t" est ajouté à la fin):
let lookupByShortName = R.find(R.propEq("short"))("t");
... mais je ne me trompe, parce que cela ne fonctionne pas, le test échoue:
1) Map short arg name to long option name map short name to long name POINTFREE: TypeError: lookupByShortName is not a function at Context.it.only (test/validator.spec.js:744:20)
Je pensais d'une autre solution (qui ne fonctionne pas, mais je ne comprends pas pourquoi):
Depuis « t » est le 2ème paramètre qui est passé à R.propEq, utilisez la R .__ espace réservé, puis passer en « t » à la fin:
let lookupByShortName = R.find(R.propEq("short", R.__))("t");
Je travaille à travers une série d'articles sur un blog, et bien que je crois comprendre mieux, je ne suis toujours pas encore là.
Pouvez-vous jeter la lumière sur l'endroit où je me trompe, merci.
Un grand merci Scott pour votre réponse, j'ai besoin de temps pour examiner et bien comprendre, avant de commenter correctement. Bravo pour l'instant ... – Zephilim