簡體   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