Ramda连锁用法

use*_*749 10 ramda.js

文档:

var duplicate = n => [n, n];
R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
Run Code Online (Sandbox Code Playgroud)

第一个例子非常简单,它将duplicate()应用于数组中的每个元素并连接结果.但我无法理解第二个例子.究竟是如何将R.append + R.head映射到数组上的呢?有人可以为第二个例子提供一步一步的解释吗?

我熟悉构图和曲目.

谢谢

Sco*_*her 13

第二个例子展示了如何R.chain使用除数组之外的其他东西,例如函数(或任何实现Fantasy Land 规范的东西).

如果您熟悉映射和连接数组的概念,您可以考虑将函数映射到另一个函数作为普通函数组合.连接部分需要进一步解释.

R.chain 声明其签名为:

Chain m => (a ? m b) ? m a ? m b
Run Code Online (Sandbox Code Playgroud)

对于数组,我们可以交换mwith []来获取:

(a ? [b]) ? [a] ? [b]
Run Code Online (Sandbox Code Playgroud)

对于接收某些参数的函数r,它变为:

(a ? r ? b) ? (r ? a) ? (r ? b)
Run Code Online (Sandbox Code Playgroud)

因此,只有可用的那些类型的知识,产生最终r ? b函数的唯一方法是执行以下操作:

  • 将收到的参数r传递给第二个函数以生成一个a
  • 将新a原件和原件r应用于第一个函数以生成结果b

或者在代码中:

// specialised to functions
const chain = (firstFn, secondFn) =>
  x => firstFn(secondFn(x), x)
Run Code Online (Sandbox Code Playgroud)

从示例中交换函数,您可以看到它变为:

x => R.append(R.head(x), x)
Run Code Online (Sandbox Code Playgroud)

如果你熟悉R.converge那么这是有效的:

R.converge(firstFn, [secondFn, R.identity])
Run Code Online (Sandbox Code Playgroud)