我正在使用 Ramda.js 并且正在努力完成一项简单的任务。有人可以告诉我: 1) 为什么它不起作用 2) 我怎样才能让它起作用
考虑以下代码:
// Defined in utils.js
const makeArrayFromNum = num => [num]
const multByTen = num => num * 10
const multByTwo = num => num * 2
const makeThing = compose(
map(multByTwo),
concat,
map(multByTen),
makeArrayFromNum
)
// Otherfile.js
// import makeThing from .......
// Call it from a different file (does not share scope with above things)
// ---------------
// Expect to get back: [100, 18] because:
// 1) 5 -> makeArrayFromNum -> [5]
// 2) [5] -> map(multByTen) -> [50]
// 3) [50] -> concat (Still needs one arg, so pulls in [9]) -> [50, 9]
// 4) [50, 9] -> map(multByTwo) -> [100, 18]
makeThing(5, [9])
当我调用 makeThing
时,我首先将 5
传递给它。 makeArrayFromNum
接受 5
并且一切顺利……也就是说,直到 concat
。 concat
返回一个函数。因为 concat
有 2 个参数,所以我希望它返回到我原来的参数列表,并找到尚未使用的 [9]
。它没有。
This应该是 Ramda REPL 的链接,使用我上面粘贴的相同代码。但至少你可以在那里运行它。
谢谢
更新
上面的代码片段不起作用,但我写了它是因为它以一种清晰的方式展示了我想要实现的目标。由于它引起了错误的注意,我添加了两个功能代码片段,它们也展示了我的目标,但方式不明确且不简洁。
由于评论中有人说不可能使用 compose
因为 compose
只接受一元函数,我觉得我应该提供 a 我想出的解决方案来帮助澄清我的问题。
希望这有助于其他人回答我的问题。
const makeThing = compose(
map(multByTwo),
useWith(
concat,
[
compose(
map(multByTen),
makeArrayFromNum
),
identity
]
)
)
makeThing(5, [9])
还有一个给后代的:
const makeThing = compose(
map(multByTwo),
converge(
concat,
[
compose(
map(multByTen),
makeArrayFromNum,
head
),
tail
]
)
)
我原来的问题仍然存在。上述解决方案在功能上获得了什么,但它们缺乏清晰性和简洁性。
最佳答案
首先可以将以下函数转化为:
num => [num]
等于R.of
num => num * 10
等于R.multiply(10)
num => num * 2
等于R.multiply(2)
我可以看到两个选项:
有一个返回另一个函数的函数
如您所见,函数组合被“硬编码”到 num 参数。请注意,我还稍微修改了您的原始功能组合
const makeThingFn = num =>
compose(
map(multiply(2)),
flip(prepend)([num]),
multiply(10));
const makeThing = makeThingFn(9);
makeThing(5); //=> [100, 18]
使用镜头
这样你就可以直接传递你的数组,但是让函数组合对特定的索引进行操作:
const makeThing =
compose(
map(multiply(2)),
over(lensIndex(0), multiply(10)));
makeThing([5, 9]); //=> [100, 18]
关于javascript - 如何传递多个参数以与 Ramda.JS 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319288/