为什么我的 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 行之间切换以查看我上面描述的问题
这至少有两个问题。首先,您混淆了 compose
和 pipe
。它们非常相似,但它们以相反的顺序应用它们的功能。
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'))
但第二个问题更为根本。 pipe
和 compose
不会将其函数列表中的一项传递给另一项。相反,它们 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
不是谓词函数。
我希望这是有道理的。昨晚我没睡多少觉,我不太确定什么是明智的。 :-)
我有一个 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 行之间切换以查看我上面描述的问题
这至少有两个问题。首先,您混淆了 compose
和 pipe
。它们非常相似,但它们以相反的顺序应用它们的功能。
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'))
但第二个问题更为根本。 pipe
和 compose
不会将其函数列表中的一项传递给另一项。相反,它们 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
不是谓词函数。
我希望这是有道理的。昨晚我没睡多少觉,我不太确定什么是明智的。 :-)