为什么我的 Ramda 管道功能不能与过滤器一起使用?

Why isn't my Ramda pipe function not working with filter?

我有一个 curried 函数,我正在组合中使用它并且有效:

const getClubs = R.filter(R.propEq('suit', 'CLUBS'))

这是接收一系列纸牌对象并按花色过滤它们。

但是当我尝试取消嵌套这个函数调用并将其变成管道时:

const getClubs = R.pipe(R.filter, R.propEq('suit', 'CLUBS'))

...这不再有效,我什至没有收到任何错误。我的管道或过滤器功能做错了什么?

这是一个working version of my code

在第 8 行和第 9 行之间切换以查看我上面描述的问题

这至少有两个问题。首先,您混淆了 composepipe。它们非常相似,但它们以相反的顺序应用它们的功能。

pipe(g, f)(x);    //=> f(g(x))

compose(g, f)(x); //=> g(f(x))

因此,如果您想要 filter(propEq('suit', 'CLUBS')) 的等价物,则需要编写以下内容之一而不是 R.pipe(R.filter, R.propEq('suit', 'CLUBS'))

R.pipe(R.propEq('suit', 'CLUBS'), R.filter)
// or
R.compose(R.filter, R.propEq('suit', 'CLUBS'))

但第二个问题更为根本。 pipecompose 不会将其函数列表中的一项传递给另一项。相反,它们 return 函数,其中第一个函数针对提供的数据调用,第二个函数针对第一个的结果调用,第三个针对第二个的结果调用,第四个针对的结果第三等

但是filter需要两个参数,一个谓词函数和一个值列表。

您的 filter(propEq('suit', 'CLUBS')) 正在将 filter(propEq('suit', 'CLUBS')) 传递给 filter,这是一个由于柯里化而导致的单参数函数,它需要一个单参数函数和一个值列表。因为我们只传递第一个,所以我们得到一个函数,该函数获取值列表并将其过滤为匹配的值。

当您尝试说 pipe(propEq('suit', 'CLUBS'), filter) 并使用名为 cards 的列表调用结果函数时,您将 cards 传递给 propEq('suit', 'CARDS'),并且由于 cards 是一个没有 suit 属性 的列表,它 return 是错误的。然后,您使用此 false 值调用 filter。因为这个柯里化函数需要两个参数,所以你会得到一个寻找第二个参数的函数。不过,这是一个无用的函数,因为第一个参数 false 不是谓词函数。

我希望这是有道理的。昨晚我没睡多少觉,我不太确定什么是明智的。 :-)