[英]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.