功能编程ramdajs arity问题



我有一个关于用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不喜欢揭示变异功能。(出于历史原因,pipecompose及其亲属仍然是变化的,但没有很多。(但是Ramda经常使用用户提供的variadic功能。提供给anyPassallPass的功能不必一致。在这里,我们将二进制功能传递给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

最新更新