【发布时间】:2017-05-17 19:34:10
【问题描述】:
作为学习 Ramda.js 练习的一部分,我正在尝试使用函数式方法来解决特定问题。
所以我有这个测试:
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");
});
“选项”用作查找序列。我需要通过引用选项序列将一系列指定为单个字符的字符串转换为等效的更长名称。所以字符“t”应该转换成options中定义的“turky”。
但是,这并不是我需要它有用的方式。 'lookupByShortName' 函数不是通用的,它是用值“t”硬编码的。我想要的是省略“t”参数,这样当你调用lookupByShortName时,因为它应该被curried(通过R.find),它应该返回一个需要缺少参数的函数。所以如果我这样做,测试就会失败:
let lookupByShortName = R.find(R.propEq("short"));
所以在这里,lookupByShortName 应该成为一个需要单个缺失参数的函数,所以理论上,我认为我应该可以如下调用该函数:
lookupByShortName("t")
或更具体地说(“t”附加在末尾):
let lookupByShortName = R.find(R.propEq("short"))("t");
...但是我弄错了,因为这样不行,测试失败:
1) 将短 arg 名称映射到长选项名称 将短名称映射到长 名称无点: 类型错误:lookupByShortName 不是函数 在 Context.it.only (test/validator.spec.js:744:20)
所以我想到了另一种解决方案(不起作用,但我不明白为什么):
因为“t”是传递给 R.propEq 的第二个参数,所以使用 R.__ 占位符,然后在末尾传入“t”:
let lookupByShortName = R.find(R.propEq("short", R.__))("t");
我已经在blog 上完成了一系列文章,虽然我的理解更好,但我还没有。
您能否说明我哪里出错了,谢谢。
【问题讨论】:
标签: javascript functional-programming ramda.js