我有一个关于用ramda和整个fp的功能的问题。
在ramdajs中,其中一些函数接受2,3参数,但其中一些函数是咖喱(接受一个或两个参数并返回另一个函数(。
例如:
const isBlackCard = R.anyPass([isClub, isSpade]);
isBlackCard({rank: '10', suit: '♣'}); //=> true
AnyPass-返回另一个等待对象的功能。
R.reduce(R.add, 0, [1, 2, 3, 4])
在这种情况下,请减少等待所有参数并返回结果=> 10
如果我遵循上一个示例,为什么减少与Anypass不同,例如:
const adder = R.reduce(R.add, 0);
const sum = adder([1, 2, 3, 4]); //10
这样,它们看起来相同。
所以为什么它们不相似,并且什么时候有任何规则来创建一个或另一个规则。
如果我们从一开始就选择了错误的方法,将来将很难更改,因为它将在许多地方使用。
也有一些库在咖喱和curried和unurried中使用类似的名称,但我不喜欢这个想法,因为它像副本一样。
谢谢
大多数ramda函数都像reduce
。它们的咖喱方式,例如fn(a)(b)(c)
,fn(a, b)(c)
,fn(a)(b, c)
和fn(a, b, c)
都返回相同的值。一小部分RAMDA功能不同。
通常原因是Ramda处理Variadic函数(即那些接受不同参数的功能(。RAMDA不喜欢揭示变异功能。(出于历史原因,pipe
和compose
及其亲属仍然是变化的,但没有很多。(但是Ramda经常使用用户提供的variadic功能。提供给anyPass
或allPass
的功能不必一致。在这里,我们将二进制功能传递给anyPass
:
const sameParity = (a, b) => a % 2 == b % 2
const foobar = R.anyPass ([gt, sameParity])
foobar (10, 8) //=> true
foobar (10, 14) //=> true
foobar (5, 7) //=> true
foobar (5, 14) //=> false
foobar (5, 8) //=> false
我们可以通过三元函数甚至更高的功能。
但是,我们如何期望将参数直接传递给此类功能?我们可能会编写anyPass([isSpade, isClub], {rank: 'K', suit: '♣'}). But would we also write
Anypass([GT,SameParity],10,8(? If so, the input to
AnyPass`变为"函数数组,然后是任意数量的其他参数" - 几乎不是纪律处分的函数。
另外,我们可以重组anyPass
,以便采用一系列函数,然后是一系列参数。这听起来不错,直到您意识到可能是多么不可收入的可能性:而不是isBlackCard(myCard)
,您必须致电isBlackCard([myCard])
。感觉真的错误。
因此,对于这几个功能,存在一个妥协:它们只返回一个函数,并且永远不要尝试将其应用于您的值。
您问这个:
如果我遵循上一个示例,为什么减少与Anypass不同,例如:
const adder = R.reduce(R.add, 0); const sum = adder([1, 2, 3, 4]); //10
好吧,实际上就是这样。您可以像大多数RAMDA函数一样调用reduce
,并使用其参数的任何初始子集,并恢复等待其他功能。
const adder = R.reduce(R.add, 0);
const sum = adder([1, 2, 3, 4]);
console.log(sum)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
唯一真正的区别是您可以也称其为reduce(add, 0, [1, 2, 3, 4])
。
但是,如果您想要一致性,在Ramda中的几个实际变异功能之外,您可以以这种样式调用所有功能,而不会损失功能:
reduce (add) (0) ([1, 2, 3, 4])
anyPass ([isClub, isSpade]) (myCard)
如今,通过一一传递论点实际上已成为我的首选风格。
在ramda 中,每个功能默认情况下是咖喱的:
RAMDA功能自动咖喱。这使您可以通过不提供最终参数来轻松地从旧功能构建新功能。
您可以在此处查看文档:https://ramdajs.com/
这基本上意味着如果一个函数的ARITY为3:
const foo = R.curry((a, b, c) => a + b + c);
将返回一个新功能,直到提供了所有3个参数。
foo(1) // => foo(1, b, c)
foo(1, 2) => // foo(1, 2, c)
foo(1)(2)(3) // => 6
当所有参数最终通过时:
foo(1, 2, 3) // => 6