javascript - 如何传递多个参数以与 Ramda.JS 组合

标签 javascript ramda.js

我正在使用 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 并且一切顺利……也就是说,直到 concatconcat 返回一个函数。因为 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
    ]
  )
)

我原来的问题仍然存在。上述解决方案在功能上获得了什么,但它们缺乏清晰性和简洁性。

最佳答案

首先可以将以下函数转化为:

  1. num => [num] 等于 R.of
  2. num => num * 10 等于 R.multiply(10)
  3. 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/

相关文章:

javascript - 无法读取未定义类型的属性 'push' 错误 : Cannot read property 'push' of undefined error

php - 为什么 ruby​​ 的 to_json 会破坏嵌入式 javascript?

javascript - lambda 。从数组创建固定长度的子数组

javascript - Ramda,在函数中发送参数

javascript - 包含 Angular 过滤器的 uI 网格列的排序

javascript - 从 JSON 获取最小和最大日期

javascript - 点击内层div运行fancybox,如何阻止外层div冒泡?

javascript - 如何使用 Ramda.js 重构这个组合函数?

javascript - 在管道中重用变量的功能方法

javascript - Ramda.js 重构