Javascript Ramda:如何将普通应用程序转换为管道或组合

Javascript Ramda:如何将普通应用程序转换为管道或组合,javascript,functional-programming,ramda.js,function-composition,compose,Javascript,Functional Programming,Ramda.js,Function Composition,Compose,这是一个新手问题,我对Ramda和函数式编程还是比较陌生的 我有一个有两个参数的函数。为了简单起见,我们假设它只是减去数字。我想翻来覆去地讨好它的论点。我已经知道了如何手动完成,但感觉它可以通过管道或组合完成,我不知道怎么做 import { curry, flip, pipe } from 'ramda'; const subtract = (a, b) => a - b; // subtract(1, 4); -3 const flippedCurriedSubtract = fli

这是一个新手问题,我对Ramda和函数式编程还是比较陌生的

我有一个有两个参数的函数。为了简单起见,我们假设它只是减去数字。我想翻来覆去地讨好它的论点。我已经知道了如何手动完成,但感觉它可以通过管道或组合完成,我不知道怎么做

import { curry, flip, pipe } from 'ramda';

const subtract = (a, b) => a - b; // subtract(1, 4); -3
const flippedCurriedSubtract = flip(curry(subtract))
// flippedCurriedSubtract(1)(4); 3

pipe(flip, curry, subtract)(1)(4); // NaN
你会如何用烟斗或作曲

编辑:

pipeflip、curry、subtract14等于subtractcurryflip14

同时,翻转的定义:

这意味着翻转函数将接收一个咖喱函数a->b->c作为参数,但现在它是一个数字,然后导致错误

pipecurry,flipsubtract等于flipcurrysubtract,这将适合。 它还返回与.composeflip、currysubtract相同的值。compose和pipe是相同的,只是方向执行函数不同

对于新手来说。我建议你阅读这篇

pipeflip,curry,subtract14等于subtractcurryflip14

同时,翻转的定义:

这意味着翻转函数将接收一个咖喱函数a->b->c作为参数,但现在它是一个数字,然后导致错误

pipecurry,flipsubtract等于flipcurrysubtract,这将适合。 它还返回与.composeflip、currysubtract相同的值。compose和pipe是相同的,只是方向执行函数不同


对于新手来说。据我所知,Ramda中的大多数函数都已经实现了,我建议您阅读这篇文章。所以你不需要再咖喱减法了

subtract(5, 10); //=> -5
subtract(5)(10); //=> -5
你可以翻转它,它仍然是咖喱的:

flip(subtract)(5, 10); //=> 5
flip(subtract)(5)(10); //=> 5
我认为你根本不需要烟斗和咖喱,你可以简单地做:

const flippedSubtract = flip(subtract);
flippedSubtract(5)(10); //=> 5
斯科特在评论中指出,flip将自动咖喱一个非咖喱功能:非常有用

const foo = (a, b, c) => `foo: ${a}${b}${c}`;
foo('x', 'y', 'z');       //=> 'foo: xyz'
flip(foo)('x')('y')('z'); //=> 'foo: yxz'

据我所知,Ramda中的大多数函数都已经实现了。所以你不需要再咖喱减法了

subtract(5, 10); //=> -5
subtract(5)(10); //=> -5
你可以翻转它,它仍然是咖喱的:

flip(subtract)(5, 10); //=> 5
flip(subtract)(5)(10); //=> 5
我认为你根本不需要烟斗和咖喱,你可以简单地做:

const flippedSubtract = flip(subtract);
flippedSubtract(5)(10); //=> 5
斯科特在评论中指出,flip将自动咖喱一个非咖喱功能:非常有用

const foo = (a, b, c) => `foo: ${a}${b}${c}`;
foo('x', 'y', 'z');       //=> 'foo: xyz'
flip(foo)('x')('y')('z'); //=> 'foo: yxz'

减法只是一个例子。在现实世界中,我有自己的函数,对于这个问题来说太长了。我指定了我自己的减法作为例子,因为减法是不可交换的。我想我应该使用另一个函数来避免与拉姆达的减法混淆。啊,当然,在这种情况下,你确实需要创作咖喱和翻转。咖喱的结果。所以FlipMyNonCommutiveFunction将按预期工作。减法只是一个例子。在现实世界中,我有自己的函数,对于这个问题来说太长了。我指定了我自己的减法作为例子,因为减法是不可交换的。我想我应该使用另一个函数来避免与拉姆达的减法混淆。啊,当然,在这种情况下,你确实需要创作咖喱和翻转。咖喱的结果。所以FlipMyNonCommutiveFunction将按预期工作。我阅读了这篇文章并完成了作业。非常好的书。现在我正试图把我学到的东西应用到现实生活中。谢谢你的回答!我读了这篇文章,做了作业。非常好的书。现在我正试图把我学到的东西应用到现实生活中。谢谢你的回答!咖喱的结果。所以flipa,b=>a-b将按预期工作。@ScottSauyet哇,这实际上是最好的答案。在拉姆达,我们的目标是取悦!或者至少让我们自己高兴-@ScottSauyet我越来越喜欢图书馆和fp。它减少了代码,因此bug的出现会导致很多结果。所以flipa,b=>a-b将按预期工作。@ScottSauyet哇,这实际上是最好的答案。在拉姆达,我们的目标是取悦!或者至少让我们自己高兴-@ScottSauyet我越来越喜欢图书馆和fp。它减少了代码,因此bug大量出现