从文档:
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传递给第二个函数以生成一个aa原件和原件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)