繁体   English   中英

Ramda-R.both与咖喱谓词

[英]Ramda - R.both with curried predicates

我的目标是在R.both中链接采用相同两个参数的两个谓词,以便我可以独立传递参数-即curried。

这是我整理的repl实现:

const isXEqual = (obj1, obj2) => R.equals(obj1.x, obj2.x);
const isYEqual = (obj1, obj2) => R.equals(obj1.y, obj2.y);

const a = R.curry(isXEqual);
const b = R.curry(isYEqual);

const isBoth_Curried = R.both(a, b);

const obj1 =  {"x": 6, "y": 5};
const obj2 =  {"x": 6, "y": 5};
const obj3 =  {"x": 5, "y": 5};

isBoth_Curried(obj1, obj2); //==> true
isBoth_Curried(obj1, obj3); //==> false

isBoth_Curried(obj1)(obj2); //==> true

但是: isBoth_Curried(obj1)(obj3); //==> true isBoth_Curried(obj1)(obj3); //==> true

真的很困惑-我在这里想念什么?

我认为Ramda的both与大多数库both略有不同步(免责声明:我是Ramda的作者之一。)这both的结果都应尽量考虑到其参数的最大长度,就像它的紧密会员一样allPass 因此,这应该可以按您期望的方式工作。

但是,正如您所建议的,我认为您缺少一些基本知识。 内部函数没有关系。 它们将仅被调用一次,并带有所有参数:

R.both(a, b)(obj1)(obj3)                 //~> [1]

(function () {
  return a.apply(this, arguments) && a.apply(this, arguments);
})(obj1)(obj3)                           //~> [2]

(isXEqual(obj1) && isYEqual(obj1))(obj3) //~> [3]

(isYEqual(obj))(obj3)                    //~> [4]

R.equals(obj1.y, obj2.y)                 //~> [5]

R.equals(5, 5)                           //=> [6]

true

最可能使您绊倒的步骤是[3], (isXEqual(obj1) && isYEqual(obj1))(obj3) (isYEqual(obj))(obj3) (isXEqual(obj1) && isYEqual(obj1))(obj3) 〜> (isYEqual(obj))(obj3) 问题的关键是, isXEqual(obj1)是因为你的钻营,一个功能,因为是isYEqual(obj1) 这两个都是真-y,因此&&返回第二个。

那应该解释发生了什么。

我确实认为Ramda的both功能都应该更新。 但是您可以像其他人所建议的那样,通过计算both的结果来使这项工作有效。


还有一点:您可以使用isXEqual isYEqual更简单地编写isXEqual / eqProps

const isXEqual = R.eqProps('x')
const isYEqual = R.eqProps('y')

我认为R.both默认情况下不被管理。 如果您执行R.curryN(2, R.both(a, b))那么它将按预期工作。 查看此REPL以查看示例。

根据Ramda的源both

var both = _curry2(function both(f, g) {
  return _isFunction(f) ?
    function _both() {
      return f.apply(this, arguments) && g.apply(this, arguments);
    } :
    lift(and)(f, g);
});

如果第一个参数是一个函数,则不会返回已管理的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM